此Python脚本使用砂纸,请求和Price_parser库来刮擦列出要出售属性的网站。它提取有关每个物业的详细信息,例如价格,标题,地址,浴室和房间的数量,区域,所有者信息,所有者URL和坐标(纬度,经度)。
库
- scrapy :Python的开源网络爬行框架。
- 请求:发送各种HTTP请求的库。
- Price_parser :从原始文本字符串中提取价格和货币的库。
让我们逐步剖析此脚本:
导入库
from scrapy import Selector
import requests
from urllib.parse import urljoin
from price_parser import Price
以上行导入脚本的必要python库。
设置初始变量
response = requests.get("https://www.pisos.com/venta/pisos-cedeira/")
sel = Selector(response)
home_url = "https://www.pisos.com"
脚本将GET请求发送到网站的URL,并使用Scrapy中的SelectorClass来创建一个可用于解析HTML的对象。
数字过滤功能
def number_filtering(number):
if type(number) == int:
return number
if type(number) == float:
return(round(number))
if type(number) == str:
number = Price.fromstring(number)
number = number.amount
if number is None:
return None
try:
return int(number)
except Exception:
return float(number)
此功能将基于字符串的数字转换为其整数或浮点表示。如果输入已经是整数或浮点,则返回输入。
获取在基因功能之间的文本
def get_text_between(full_string, start_substring, end_substring):
start = full_string.find(start_substring) + len(start_substring)
end = full_string.find(end_substring, start)
return "" if start == -1 or end == -1 else full_string[start:end]
此功能需要三个参数:完整的字符串和两个子字符串。它找到了位于两个子字符串之间的文本。
获得纬度和经度功能
def get_lat_lon(response):
selector = Selector(response)
lat = get_text_between(selector.css("script[type='text/javascript'] ::text").get(), "_Lat = ", ";")
lon = get_text_between(selector.css("script[type='text/javascript'] ::text").get(), "_Long = ", ";")
return lat, lon
此函数从页面的HTML中包含的JavaScript提取纬度和经度值。
解析广告功能
def parse_ad(ad_response):
...
print(f"Price: {price}")
print(f"Title: {title}")
print(f"Address: {address}")
print(f"N_baths: {n_baths}")
print(f"N_rooms: {n_rooms}")
print(f"Area: {area}")
print(f"Owner info: {owner_info}")
print(f"Owner url: {owner_url}")
print(f"Description: {description}")
print(f"Source id: {source_id}")
print(f"Latitude: {lat}")
print(f"Longitude: {lon}")
print("=============================================================")
此功能解析了AD的HTML,并打印出有关该属性的数据。它从广告的html中提取价格,标题,地址,浴室和房间,区域,所有者信息,所有者URL,说明,源ID和坐标(纬度,经度)。
解析所有广告
all_ads = sel.css("div.ad-preview")
for ad in all_ads:
url = ad.css("a::attr(href)").get()
ad_response = requests.get(urljoin(home_url, url))
parse_ad(ad_response)
最后,脚本在所有广告预览divs上迭代,向每个AD的URL发送请求,然后用 parse_ad()函数解析响应。函数。
完整代码 - > https://gist.github.com/VictorLG98/994874841e52213cf20e7c2a91ee781a
我的YouTube上的视频 - > linktree