刮擦真实状态网站
#教程 #python #scraping

linktree

此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