scrapy 操作 make_requests_from_url 遇到的坑

2017-08-15 10:28:34 +08:00
 akmonde

遇到个比较奇葩的问题,这两天做个小采集测试,然后用了下 scrapy。 以前只拿这玩意儿的成品二次改过,重新从开头弄感觉有点头大,遇到一些细节问题不好解决。 比如下面,我运行到这行就没下文了,后面的代码并没有执行:

items.extend([self.make_requests_from_url(url).replace(callback=self.parse) for url in validurls])

按理说这里就给爬虫返回请求而已,后面应该是能继续执行的。 validurls 实测是有数据的,不知道这里出了啥毛病,总的局部代码如下:

class DSpider(CrawlSpider):
    #继承自 CrawlSpider,实现自动爬取的爬虫。

    name = 'DSpider'

    download_delay = 1
    start_urls = ['http://www.baidu.com']

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        items = []
        newurls = hxs.select('//a/@href').extract()  
        validurls = []  
        for url in newurls:
            validurls.append(url)
        items.extend([self.make_requests_from_url(url).replace(callback=self.parse) for url in validurls])
        sites = hxs.select('//html')
        for site in sites:
            item = DomainspiderItem()
            item['title'] = site.select('a/text()').extract()
            item['link'] = site.select('a/@href').extract()
            item['desc'] = site.select('text()').extract()
            items.append(item)
        return items

个人觉得 make_requests_from_url 把请求返回后,应该是能直接执行下去的。

网上找了些参考资料:

https://github.com/qz267/ITP/blob/1f8cdfc104e2ed5c2e7a479ef103ac9511e2891c/blog_crawl/blog_crawl/spiders/mindhacks_spider.py

https://www.douban.com/note/287386156/

https://segmentfault.com/q/1010000002556752

大佬们麻烦给点指正意见,批评和友善喷没关系。 不然我这儿一头雾水,小问题耽误不少时间就很糟糕了。。 在线等,感谢!

3048 次点击
所在节点    Python
5 条回复
brucedone
2017-08-15 10:47:12 +08:00
1.crawl spider 是和 rule 搭配使用的
2.使用使用一般的 spider 就可以了
3.不要自己写一些魔性的方法和方式,该 yield request 就弄 request,该 yield item 就 yield item

想学 scrapy,博客参考:
http://brucedone.com/archives/771

代码参考:
https://github.com/BruceDone/scrapy_demo
yedashuai
2017-08-15 11:08:41 +08:00
@brucedone 活捉大鱼,哈哈哈
brucedone
2017-08-15 11:55:49 +08:00
@yedashuai 这位兄弟也是群里的?
yedashuai
2017-08-15 11:59:51 +08:00
@brucedone 当然啦,咱们出现在好多个群里
akmonde
2017-08-15 12:50:48 +08:00
@brucedone 没,rule 原来有的,这里没需要所以去了。因为继承 BaseSpider 老给我报错,比较烦就直接用这个了。
另外,话说这地方大佬看出来还有啥问题么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382995

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX