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

请问有没有这样的爬虫代码范例

  •  
  •   saximi · 2017-09-20 20:54:18 +08:00 · 2823 次点击
    这是一个创建于 2622 天前的主题,其中的信息可能已经有所发展或是发生改变。
    实现爬虫功能的同时,也进行了以下处理:
    1、修改了 HTTP 请求头,每次爬取时随机选择一个使用
    2、将真实 IP 地址进行了屏蔽,每次爬取时从 IP 池中选择一个使用
    3、初始访问页面是第一页,根据页面上的选择页控件,爬完当前页后接着爬取下一页直至全部爬取完毕
    4、爬取的数据存储到数据库
    5、最好能用到 PhantomJS 这个浏览器——这个条件不强求,但是有的话最好

    请问有满足上述条件的爬虫代码范例可供学习么?
    非常感谢!
    22 条回复    2017-09-25 09:16:30 +08:00
    stcasshern
        1
    stcasshern  
       2017-09-20 21:05:34 +08:00
    scrapy webmagic 都可以吧,这些都是爬虫框架基本的功能要求。
    另外实际来看,不要每次爬取随机选择 UA (第一条是说这个意思吧?
    saximi
        2
    saximi  
    OP
       2017-09-20 21:18:11 +08:00
    @stcasshern 第一条是说每次爬取从一个列表中选择其中一个 UA,而不是每次都固定用同一个 UA。
    看过 scrapy 的说明文档,感觉内容比较庞杂,希望能结合具体完整的例子来学习爬虫,而且希望这个代码例子能实现我列出的这些功能。
    tonghuashuai
        3
    tonghuashuai  
       2017-09-20 21:33:35 +08:00
    这是每一个爬虫的基本功能,找一个爬虫都可以实现这些功能。
    keenwon
        4
    keenwon  
       2017-09-20 21:37:19 +08:00
    按照你的条件:
    1、最好用 nodejs,而且 PhantomJS 是坑,可以考虑 chrome headless,已经有比较好的开源库了
    2、第 1,3,4 条都很简单
    3、第 2 不就是个代理池吗?
    fiht
        5
    fiht  
       2017-09-20 21:53:08 +08:00
    https://gist.github.com/anonymous/4a7f7d2c1efbbaaa515f0031cea9c4b2
    写了个简单的,本地环境有问题没直接跑但是大概写了一下思路。能够实现楼主的大部分需求了。
    楼上上来就说框架的未免有点太新手不友好了。
    其实爬虫就两件事情,模拟用户访问,grep 出想要的内容然后保存起来。
    模拟用户访问无非就是发送一个 http request,或者通过浏览器发送 JS 加密过的 http reqeust。这个每个语言都有自己的 http client,应该也是都有自定义类似 User-Agent 头、设置代理 IP 这样的功能。所以第一步的解决方案是看对应语言的 API 的 http client 如何自定义发送内容:比如讲上面说的自定义 UA,如何 POST 数据,如何设置代理 etc...
    第二部保存起来,你可以写文件,写数据库,或者写入其他的存储引擎。我们通过第一步就得到 html 代码了,grep 出来可以用正则表达式,或者基于 dom 树去选取。然后就更加不是问题了。

    ============
    以上内容面对新手,同样适用于简单爬虫。
    dsg001
        6
    dsg001  
       2017-09-20 22:00:03 +08:00
    stcasshern
        7
    stcasshern  
       2017-09-20 22:04:43 +08:00
    @saximi 我的意思是要避免这种情况,我的经验是 实际切换 UA 的话服务器很容易就发现这是爬虫行为。
    hcnhcn012
        8
    hcnhcn012  
       2017-09-20 22:06:29 +08:00   ❤️ 1
    建议用 scrapy 框架
    1,2 两条可以去看 http://scrapoxy.io/
    存储到数据库的话可以参考各大数据库的 python 驱动然后写到 pipeline 里
    saximi
        9
    saximi  
    OP
       2017-09-20 22:39:23 +08:00
    @fiht
    @dsg001
    @stcasshern
    @hcnhcn012 @keenwon 感谢各位的指点,提供的资料我要仔细看看,顿首拜!
    fiht
        10
    fiht  
       2017-09-20 22:40:57 +08:00
    楼上让新手用 scrapy 实现随机 UA 和代理 IP 你们是认真的么...
    seven2016
        11
    seven2016  
       2017-09-20 23:02:59 +08:00
    https://github.com/shisiying/tc_zufangk
    这个范例可以参考下
    seven2016
        12
    seven2016  
       2017-09-20 23:09:38 +08:00
    https://github.com/shisiying/tc_zufang
    上面地址多打了 k,这是准确地址
    toono
        13
    toono  
       2017-09-21 08:59:50 +08:00
    saximi
        14
    saximi  
    OP
       2017-09-21 19:24:07 +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 的开启和关闭是在哪里设置的?
    saximi
        15
    saximi  
    OP
       2017-09-21 19:48:39 +08:00
    @toono 在您的爬虫代码中 from_crawler()方法里有这个语句

    crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)

    请问哪里可以找到对 signals.connect() 这个函数的详细用法说明?谢谢!
    saximi
        16
    saximi  
    OP
       2017-09-21 20:10:38 +08:00
    @toono douban.py 这个代码是否是写得比较早,从现在的页面来看,下面的语句中 class 为 topic-content 的标签是不存在的?

    item['body'] = response.xpath('//div[@class="topic-content"]')
    saximi
        17
    saximi  
    OP
       2017-09-21 20:33:00 +08:00
    @fiht 不知为何,我点击“显示 Gist 代码”没有任何显示,直接把网址复制到浏览器也打不开,看不到代码呢
    fiht
        18
    fiht  
       2017-09-21 21:14:59 +08:00
    @saximi 你需要 fq
    saximi
        19
    saximi  
    OP
       2017-09-21 22:25:33 +08:00
    @toono 您代码中的 DoubanCookieChangeMiddleware 类用于动态改变 cookie。但是在 douban.py 程序中并没有输入用户和密码的登录动作,为什么会有 cookie ?
    toono
        20
    toono  
       2017-09-22 09:46:44 +08:00
    @saximi 我运行了一下豆瓣爬虫,没毛病,而且我去查看了有 topic-content class。关于 cookie 并不是需要登录用户才会有的。

    关于 signal 你可以参看文档的 signal 一章及 http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/extensions.html?highlight=signals.connect

    signal 我理解还是不够深入,所以先不多解释。
    saximi
        21
    saximi  
    OP
       2017-09-22 21:33:10 +08:00
    @toono 太奇怪了,您爬虫主页是 https: //www.douban.com/group/explore,我无论是用 IE 还是 CHROME 浏览器访问这个页面,打开页面源码后都找不到“ topic-content ”这个字符串呢。
    我用 FIDDLER 工具查看访问 https: //www.douban.com/group/explore 时的报文,点击 COOKIE 按钮时提示并无 COOKIE,是在不明白。
    toono
        22
    toono  
       2017-09-25 09:16:30 +08:00
    @saximi topic-content 是在帖子里面的,https: //www.douban.com/group/explore 是帖子列表。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6086 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:39 · PVG 10:39 · LAX 18:39 · JFK 21:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.