【问题标题】:scrapy spider scrapes same data multiple timesscrapy spider 多次抓取相同的数据
【发布时间】:2020-09-21 10:24:16
【问题描述】:

所以我试图用 scrapy 在网上搜索一些评论。我遍历了我所有项目所在的容器,以减少请求的数量并使蜘蛛更快。我在完成整个抓取后得到的 csv 显示蜘蛛有时会复制超过 20 行或更多行中收集的数据。 但是,当我不循环遍历容器时,蜘蛛会非常缓慢,在几页后停止抓取但正确返回数据。

我还通过更改 url 值生成了下一页,如下面的代码所示。我这样做是因为 html 没有下一页图标的 href 值。

我不知道怎么了。我需要帮助!

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.loader import ItemLoader
from yelp.items import YelpItem
import urllib.parse
from scrapy.http.request import Request
from scrapy.loader.processors import TakeFirst, MapCompose, Join
from scrapy.linkextractors import LinkExtractor

class RestSpider(scrapy.Spider):
    name = 'rest'
    start_urls = ['https://www.yelp.com/biz/burma-superstar-san-francisco-2?osq=Restaurants/']
    

def parse(self, response):
    pages = [str(i) for i in range(0,6800,20)]
    for page in pages:
        url = 'https://www.yelp.com/biz/burma-superstar-san-francisco-2?osq=Restaurants&start='+page
        yield Request(urllib.parse.urljoin(response.url, url))
        
        
    selectors = response.xpath("//div[contains(@class,'lsidebarActionsHoverTarget')]")
    for selector in selectors:
        yield self.parse_item(selector, response)


def parse_item(self,selector,response):
    l=ItemLoader(item=YelpItem(),selector = response)
    l.default_output_processor = TakeFirst()
    l.add_xpath('date', './/span[@class="lemon--span__373c0__3997G text__373c0__2Kxyz text-color--mid__373c0__jCeOG text-align--left__373c0__2XGa-"]/text()')
    l.add_xpath('location', './/span[@class="lemon--span__373c0__3997G text__373c0__2Kxyz text-color--normal__373c0__3xep9 text-align--left__373c0__2XGa- text-weight--bold__373c0__1elNz text-size--small__373c0__3NVWO"]/text()')
    l.add_xpath('review', './/p[contains(@class, "comment")]/span/text()')
    l.add_xpath('rating', './/div[contains(@class,"i-stars")]/@aria-label')
    return l.load_item()
    

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    问题来了:

    def parse_item(self,selector,response):
        l=ItemLoader(item=YelpItem(),selector = response)
    

    您的代码创建了多个选择器,但您从不使用它们。相反,您总是将response 传递给您的项目加载器。

    【讨论】:

    • 我以为我在指定时使用了选择器。选择器 = 响应而不是响应 = 响应。请问我应该如何编写代码来使用选择器。
    • 您需要selector=selector。您在技术上使用选择器,但它始终是同一个 (response.selector)
    • 感谢一百万,它就像魔术一样工作。但是我仍然对选择器=响应和选择器=选择器之间的区别感到困惑。我之前将前者用于我的一只蜘蛛并且它起作用了。不知道为什么它在这种情况下不起作用
    猜你喜欢
    • 2023-03-09
    • 2020-10-03
    • 2021-03-04
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2014-10-06
    相关资源
    最近更新 更多