scrapy抓取信息另一个网站

时间:2018-02-17 11:06:08

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

源: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以逐步查看正在执行的解析函数?

1 个答案:

答案 0 :(得分:1)

对于调试目的,您可以在scraper的文件夹中创建一个包含以下内容的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

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