我正在用 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)
如何排除西班牙语结果以及波士顿以外的结果?
答案 0 :(得分:1)
问题不在于 Scrapy,它使自己工作得很好。您抓取的网站给出的结果不是很正确,但您可以修复它。几分钟后,我找到了两种方法 解决问题:
波士顿所有公寓的链接都有特殊格式,如https://www.apartments.com/<name>-boston-ma/<param>/
。将此链接格式添加到您的规则中。
所有公寓的地址也有特殊格式,如<part_of_addres>, Boston, MA <code>
。你可以检查这个参数,如果他是有效的,那么收集这个信息,否则跳过。
更新。您还可以尝试查找一些搜索过滤器(如果存在),并将它们包含在您的请求中,以最大限度地减少请求计数并采取更正确的响应。