配置:使用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和价格,但其他数据(地点等)是空白的。我在终端没有任何错误。
我读了文档,但我真的是新的,感觉好像有无限的方式这样做,我有点不知所措。
1条答案
按热度按时间t3irkdon1#
没有任何错误,因为丢失的数据隐藏在JS后面。转到随机报价并禁用javascript(devtools)。您将看到所有可用的信息/scrapy。不使用selenium的一种访问方法是通过json info:
ps.你需要清理响应,因为json加载抛出错误
结果为:
'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