Scrapy与剧作家-刮immoweb

q3aa0525  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(262)

配置:使用ubuntu终端的WSL。用Python编写VS代码已安装的模块:爱挑剔的剧作家
项目:从网站www.immoweb.be(比利时真实的地产网站)提取数据。JavaScript组件存在,因此剧作家模块。
起始网址:搜索结果房屋和公寓在比利时

这是我正在运行的代码。

import scrapy
from scrapy_playwright.page import PageMethod

class ImmoSpider(scrapy.Spider):
    name = "immospider"

    def start_requests(self):
        yield scrapy.Request(
            url="https://www.immoweb.be/en/search/house-and-apartment/for-sale?countries=BE&page=1&orderBy=relevance",
            meta={
                "playwright": True,
                "playwright_page_methods": [
                    PageMethod("wait_for_selector", 
            'article.card.card--result.card--xl'),
                ],
            },
        )

    async def parse(self, response):
        properties = response.css('article.card.card--result.card--xl')

        **#untested loop. Goal : go through every page and scrape the data from every card**
        
        """
        for page_num in range(1, 10):
                url = f'https://www.immoweb.be/en/search/house-and-apartment/for-sale?countries=BE&page={page_num}&orderBy=relevance'
                yield Request(url=url, callback=self.parse, 
                                        meta={'page': page_num})
        """

        for property in properties:
            #link = response.urljoin(property.xpath('.//a[text()]/@href').get
            url = property.css('h2 a::attr(href)').get()
            yield scrapy.Request(url,
                                 callback=self.parse_product,
                                 meta={
                                     "playwright": False
                                 }
                                 )

    async def parse_product(self, response):
        yield {
            'url' : response.url,
            'Price' : response.css('.classified__header-primary-info p.classified__price span.sr-only::text').get(),
            'Living Area' : response.css('#accordion_eeca443b-8b41-4284-b4af-5ab3f1622768 td.classified-table__data::text').get(),
            'Locality': response.css('span.classified__information--address-row::text').get(),
            'Type of property (House/apartment)':response.css('test'),
            }

输出用“scrapy crawl immospider -o results.csv”命令行保存。

预期输出:数据从每个搜索页面的每张卡片中抓取并显示在csv文件中。
实际产量:第一个搜索页面上显示的30张卡片的url和价格,但其他数据(地点等)是空白的。我在终端没有任何错误。

我读了文档,但我真的是新的,感觉好像有无限的方式这样做,我有点不知所措。

t3irkdon

t3irkdon1#

没有任何错误,因为丢失的数据隐藏在JS后面。转到随机报价并禁用javascript(devtools)。您将看到所有可用的信息/scrapy。不使用selenium的一种访问方法是通过json info:

import json
import re

data = re.search(r"window.classified = (.*);",response.xpath('//div[@class="classified"]/script/text()').get()).group(1)

ps.你需要清理响应,因为json加载抛出错误

json.loads(data)["property"]["location"]["street"]

结果为:'Rue Jules Hans' testing for https://www.immoweb.be/en/classified/apartment/for-sale/braine-l%27alleud/1420/10572916。只是摆弄一下钥匙。
你也可以使用.get()方法来处理dicts,你可以使用在线json linter来转换//div[@class="classified"]/script/text(),使其更具可读性。不要忘记删除最后的;window.classified

相关问题