V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
akmonde
V2EX  ›  Python

scrapy 操作 make_requests_from_url 遇到的坑

  •  
  •   akmonde · 2017-08-15 10:28:34 +08:00 · 3139 次点击
    这是一个创建于 2665 天前的主题,其中的信息可能已经有所发展或是发生改变。

    遇到个比较奇葩的问题,这两天做个小采集测试,然后用了下 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
    

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

    5 条回复    2017-08-15 12:50:48 +08:00
    brucedone
        1
    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
        2
    yedashuai  
       2017-08-15 11:08:41 +08:00
    @brucedone 活捉大鱼,哈哈哈
    brucedone
        3
    brucedone  
       2017-08-15 11:55:49 +08:00
    @yedashuai 这位兄弟也是群里的?
    yedashuai
        4
    yedashuai  
       2017-08-15 11:59:51 +08:00
    @brucedone 当然啦,咱们出现在好多个群里
    akmonde
        5
    akmonde  
    OP
       2017-08-15 12:50:48 +08:00
    @brucedone 没,rule 原来有的,这里没需要所以去了。因为继承 BaseSpider 老给我报错,比较烦就直接用这个了。
    另外,话说这地方大佬看出来还有啥问题么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2843 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:05 · PVG 20:05 · LAX 04:05 · JFK 07:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.