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
saximi
V2EX  ›  Python

请推荐关于 Scrapy 包用法的中文版学习资料

  •  
  •   saximi · 2017-08-31 20:29:50 +08:00 · 2779 次点击
    这是一个创建于 2639 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最好是能在断网环境下离线阅读的资料和电子书籍,万分感谢了!
    21 条回复    2017-09-25 09:14:15 +08:00
    dsg001
        1
    dsg001  
       2017-08-31 20:33:22 +08:00
    fiht
        2
    fiht  
       2017-08-31 20:48:40 +08:00
    搞爬虫的还能断网?
    GreatMartial
        3
    GreatMartial  
       2017-08-31 21:03:52 +08:00 via Android
    @dsg001 厉害了,老哥
    friejq
        4
    friejq  
       2017-08-31 22:15:52 +08:00   ❤️ 1
    flamepeak
        5
    flamepeak  
       2017-08-31 22:24:43 +08:00 via Android
    最近刚用 scrapy 写完一个小项目,把自己的一些经验写在博客上了,flamepeak.com 上了,可以看看,可以发邮件交流
    saximi
        6
    saximi  
    OP
       2017-08-31 22:45:56 +08:00
    @fiht 爬虫是自己学的,公司是断网的,唉
    toono
        7
    toono  
       2017-09-01 08:50:49 +08:00
    辛苦了,公司竟然断网
    friejq
        8
    friejq  
       2017-09-01 08:56:17 +08:00
    @toono 我们办公室也不给接外网,我还以为很多都这样--.
    toono
        9
    toono  
       2017-09-01 09:11:22 +08:00
    @friejq 😂你的公司是我知道的第一家。我同学们的公司都没有这样。

    难道你们做金融的?
    toono
        10
    toono  
       2017-09-01 09:12:35 +08:00
    @saximi 想问一句,公司断网,要这爬虫有何用(摔
    hjl416148489
        11
    hjl416148489  
       2017-09-01 12:01:24 +08:00
    看学习资料还不如看 Python 视频教程,由浅入深,小白也能变大牛哈: http://www.sucaihuo.com/video/13.htmlhttp://www.sucaihuo.com/video/20.html
    saximi
        12
    saximi  
    OP
       2017-09-01 20:13:44 +08:00
    @toono 就算断网也有需要用爬虫的场合,只是对于我个人而言倒是工作上还没有用到,但是希望能多了解一门技术,所以排除困难也要学
    saximi
        13
    saximi  
    OP
       2017-09-01 20:20:40 +08:00
    @dsg001 请问这个下载后不是可以直接阅读的,还要在 LINUX 下编译才行? 我直接输入 ./Makefile htmlhelp 结果报错了,WINDOWS 下可以让这些文件变成可读的么?
    toono
        14
    toono  
       2017-09-02 01:03:33 +08:00
    那不介意的话可以看看我在写的爬虫 https://github.com/ToonoW/TopicsSpiders
    dsg001
        15
    dsg001  
       2017-09-02 10:36:19 +08:00
    @saximi 没编译过,http://scrapy-chs.readthedocs.io/zh_CN/latest/ 在线版,可以离线保存
    fhefh
        16
    fhefh  
       2017-09-02 17:21:47 +08:00
    先 mark
    saximi
        17
    saximi  
    OP
       2017-09-21 19:04:36 +08:00
    @toono

    ```
    我学习了您上传的爬虫代码,有一些问题想请您指点。万分感谢了!
    1、middlewares.py 中 MyAgentMiddleware 和 DoubanCookieChangeMiddleware 都是下载中间件,为何前者定义中声明了__init__方法,但后者却没有?

    2、middlewares.py 中 MyAgentMiddleware 的__init__方法为什么要这个参数:user_agent=''

    3、我看了 scrapy 0.25 的官方说明文档,里面提到:“ process_request() 必须返回其中之一: 返回 None、返回一个 Response 对象、返回一个 Request 对象或 raise IgnoreRequest ”
    但是您的 MyAgentMiddleware 和 DoubanCookieChangeMiddleware 都没有 return 语句,这是为何?

    4、既然 MyAgentMiddleware 和 DoubanCookieChangeMiddleware 都没有返回,这两个类中的 process_request()是否会依序先后被调用,如果会的话,把两个类合并为一个类,在一个类中实现所有的方法是否更合理?

    5、pipelines.py 中有的类实现了 open_spider()这个方法,而只有当 spider 被开启时,这个方法被调用。请问 spider 的开启和关闭是在哪里设置的?

    ```
    toono
        18
    toono  
       2017-09-22 09:21:02 +08:00
    @saximi

    1. 这是看需求的,__init__方法的意义就是在于初始化。MyAgentMiddleware 中的__init__编写的意义在于记录我的 user_agent 的数目,方便后面的逻辑中使用 random 的随机方法。

    2. 哈哈,这个是手误,原本打算用类似于 pipelines.py 中 MongoDBPipeline 的类初始化方法的,但是觉得直接写__init__方法更简便。

    3. 我这里没有 return 语句实际上就是 return 了 None。

    引用:如果其返回 None,Scrapy 将继续处理该 request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该 request 被执行(其 response 被下载)。

    也就是我返回 None 的话,会继续按照 settings.py 的配置按顺序执行其他 Downloader Middleware。假如返回了 Response 对象,则会直接到达 spider 中 call_back 对应的方法进行返回的解析了。

    4. 会有顺序,顺序就是 settings.py 中的优先级(数字)。为了爬虫群功能清晰,所以不同作用的功能分成不同的 Middleware 了。有的时候某个 Middleware 是某个爬虫特异需要的,那样子就可以做爬虫内配置去启用或者关闭 Middleware。有点拼乐高的意思。

    像你说的合在一个类并非不行,只是不好。

    5. 我认为开始爬虫的时候 spider 就是被开启的。你可以在 open_spider 方法调试输出,被调用的次数并不多。另外可以参考一下核心 API 状态收集器(Stats Collector) API。
    saximi
        19
    saximi  
    OP
       2017-09-22 21:19:29 +08:00
    @toono 非常感谢您的耐心答复!关于您的爬虫代码,还有两个问题请教:

    1、douban.py 中构造下一页网址的语句如下

    next_page = response.xpath('//span[@class="next"]/a/@href').extract_first()

    next_page_url = self.start_urls[0] + next_page

    从豆瓣首页来看,第一条语句运行后的结果是 next_page = 'https://www.douban.com/group/explore?start=30'

    因为 start_urls = ['https://www.douban.com/group/explore'] ,所以 self.start_urls[0]就是 'https://www.douban.com/group/explore'

    所以第二条语句运行即为 next_page_url = 'https://www.douban.com/group/explore' + 'https://www.douban.com/group/explore?start=30'

    这明显就不是合法的 URL 了,请问我这个看法是否正确呢?谢谢


    2、pipelines.py 中的 ImagesDownloadPipeline 类,没有实现 process_item()方法,这个类实际上是不会起作用的吧?

    pipelines.py 中 MongoDBPipeline 类的 process_item()方法并没有 return item,是不是这个类也不会起作用?
    saximi
        20
    saximi  
    OP
       2017-09-22 21:44:46 +08:00
    @toono 在您的代码中还有这一句,请问哪里可以找到 remove_tags 的用法说明呢,我在 baidu 和 bing 上用 python 加上 remove_tags 作为关键字竟然都找不到?

    item['body'] = remove_tags(item['body'].extract_first(), which_ones=('span', ))
    toono
        21
    toono  
       2017-09-25 09:14:15 +08:00
    @saximi

    1. 在我这 next_page 为" ?start=30 ",并不是完整的网址,所以拼接起来的下一页 URL 是没问题的。
    ![]( )

    2. 这个类继承了一个父类 ImagesPipeline,我只需要重载其中的两个处理方法就好了。

    3. remove_tags 不是 python 标准库里的,而是 scrapy 的。使用方法可以查看它的源码定义,有相关的使用文档注释。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3914 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:23 · PVG 13:23 · LAX 21:23 · JFK 00:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.