【问题标题】:scrapy crawl information another sitescrapy爬取信息另一个站点
【发布时间】:2018-02-17 11:06:08
【问题描述】:

来源:https://github.com/martin-varbanov96/scraper/blob/master/logo_scrape/logo_scrape/spiders/test_spider.py

我想从站点 x1、...、xn 中抓取数据,并且对于每个 x,我会抓取 10 个内部站点。

我一一解析我的网站:

for el in get_data():
            yield scrapy.Request(el, self.parse)

然后为每个站点 x 我设置一些属性:

    self.site_id += 1
    self.link_id = response.url
    self.status = -9999
    self.current_link = ""
    self.link_img = ""
    self.pattern_id = -9999
    self.found_image = False

在检查后转到另一个解析器 10 个站点

yield scrapy.Request(link_to_next_page, self.parse_inner_page)

def parse_inner_page(self, response):
...
yield LogoScrapeItem(site_id=self.site_id,
                                     link_id=self.link_id,
                                     status=self.status,
                                     current_link=self.current_link,
                                     pattern_id=self.pattern_id,
                                     found_img=self.found_img,
                                     link_img=self.link_img
                                     )

我认为这个过程很简单:我们得到站点 x,对于这个站点 x,我们抓取 10 个内页,然后我们继续处理另一个 x 等等。

问题:为什么我的数据会混淆?一个数据条目可能包含来自一个站点的链接和来自另一个站点的图像?

可能的解决方案:

可能是scrapy的异步功能:

这是我所期望的:

parse_site -> parse_page_within -> parse_page_within-> parse_page_within-> parse_page_within-> parse_page_within

这可能是现实:

parse_site -> parse_site -> parse_site -> parse_page_within-> parse_page_within-> parse_page_within

另一种可能的解决方案:

也许如果我能够使用其中一些变量向其他解析方法发送一些数据,通过回调函数,我就不必依赖类变量的当前状态

如何逐页抓取我的页面?如果这是我的问题,我该如何停止异步操作,如果不是我该怎么办?

如何调试scrapy,一步一步看什么解析函数在一个接一个地执行?

【问题讨论】:

    标签: python python-3.x scrapy web-crawler python-requests


    【解决方案1】:

    出于调试目的,您可以在您的爬虫文件夹中创建一个包含以下内容的 main.py:

    from scrapy import cmdline
    cmdline.execute("scrapy crawl nameofyourspider".split())
    

    然后使用 IDE 中的调试/断点机制执行它。

    最主要的是,为了以正确的方式将抓取的数据放在一起,我建议您使用Request.meta 属性将值传递给请求。

    来自official guide

    在某些情况下,您可能有兴趣将参数传递给这些回调函数,以便稍后在第二个回调中接收参数。您可以为此使用 Request.meta 属性。

    下面是一个示例,说明如何使用此机制传递项目,以填充来自不同页面的不同字段:

    def parse_page1(self, response):
        item = MyItem()
        item['main_url'] = response.url
        request = scrapy.Request("http://www.example.com/some_page.html",
                                 callback=self.parse_page2)
        request.meta['item'] = item
        yield request
    
    def parse_page2(self, response):
        item = response.meta['item']
        item['other_url'] = response.url
        yield item
    

    这样,即使在异步模式下,您也可以轻松地将外部页面与内部页面关联,从而轻松以正确的方式导出结果。

    【讨论】:

    • 我发现了类似的情况,关于调试...我没有使用IDE,我很难调试...我该怎么办?
    • 我一直使用pycharm进行调试,所以没遇到过这个问题...看看官方指南docs.scrapy.org/en/latest/topics/debug.html或者你可以在stackoverflow中搜索...我见过很多关于scrapy调试的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多