Scrapy 解析不需要的 URL

时间:2021-03-08 12:56:54

标签: python scrapy

我正在用 Scrapy 抓取公寓网站。我得到了一些不需要的结果。具体来说,我从附近的城市和西班牙语版本的 apartment.com 获得结果。在每个公寓列表的底部,都有一个“附近的公寓”功能,这可能就是 Scrapy 在波士顿以外获得结果的原因。我试图用我的拒绝规则阻止 /es/ 列表,但它似乎不起作用。

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from apt.items import AptItem
from urllib.parse import urljoin
from scrapy.selector import Selector


class AptSpider(CrawlSpider):
    name = "apt"
    allowed_domains = ["apartments.com"]
    start_urls = ["https://www.apartments.com/boston-ma/"]

    rules = (Rule(LinkExtractor(allow=r'[1-9]+/*'), callback='parse_urls', follow=False),
    Rule(LinkExtractor(deny=(r'/es/.*', ))),)

    def parse_item(self, response):    
        //parse item code

    def parse_urls(self, response):
        apts = response.xpath("//*[contains(@class, 'property-link')]/@href").extract()
        for a in apts:
            url = urljoin(response.url, a)
            yield scrapy.Request(url, callback=self.parse_item)

如何排除西班牙语结果以及波士顿以外的结果?

1 个答案:

答案 0 :(得分:1)

问题不在于 Scrapy,它使自己工作得很好。您抓取的网站给出的结果不是很正确,但您可以修复它。几分钟后,我找到了两种方法 解决问题:

第一种方式

波士顿所有公寓的链接都有特殊格式,如https://www.apartments.com/<name>-boston-ma/<param>/。将此链接格式添加到您的规则中。

第二种方式

所有公寓的地址也有特殊格式,如<part_of_addres>, Boston, MA <code>。你可以检查这个参数,如果他是有效的,那么收集这个信息,否则跳过。

更新。您还可以尝试查找一些搜索过滤器(如果存在),并将它们包含在您的请求中,以最大限度地减少请求计数并采取更正确的响应。