天天看点

大数据与云计算学习:Python网络数据采集爬虫的基本原理Python的一些基础爬虫模块实例4 scrapy常用工具参考

本文将介绍网络数据采集的基本原理:

如何用Python从网络服务器请求信息

如何对服务器的响应进行基本处理

如何以自动化手段与网站进行交互

如何创建具有域名切换、信息收集以及信息存储功能的爬虫

所谓爬虫就是一个自动化数据采集工具,你只要告诉它要采集哪些数据,丢给它一个 URL,就能自动地抓取数据了。其背后的基本原理就是爬虫程序向目标服务器发起 HTTP 请求,然后目标服务器返回响应结果,爬虫客户端收到响应并从中提取数据,再进行数据清洗、数据存储工作。

Python 提供了非常多工具去实现 HTTP 请求,但第三方开源库提供的功能更丰富,你无需从 socket 通信开始写,比如使用Pyton内建模块 urllib 请求一个 URL

这里我们先操练起来,写个测试爬虫

然后,把这段代码保存为`scrapetest.py`,终端中运行如下命令

这里会输出<code>http://jxdxsw/</code>这个网页首页的全部HTML代码

<code>鲸鱼注</code>: 

Python 3.x中urllib分为子模块:

 - urllib.request

urllib.parse

urllib.error

urllib.robotparser

 urllib是python的标准库,它能够:

从网络请求数据

处理cookie

改变 请求头和用户代理 等元数据的函数

标准示例

这里的请求体 data 为空,因为你不需要提交数据给服务器,所以你也可以不指定

urlopen 函数会自动与目标服务器建立连接,发送 HTTP 请求,该函数的返回值是一个响应对象 Response

里面有响应头信息,响应体,状态码之类的属性。

Python 提供的urllib内建模块过于低级,需要写很多代码,使用简单爬虫可以考虑 Requests

<a href="http://python-requests.org">http://python-requests.org</a>

<a href="http://docs.python-requests.org/zh_CN/latest/user/quickstart.html">quickstart</a>

服务器反爬虫机制会判断客户端请求头中的User-Agent是否来源于真实浏览器,所以,我们使用Requests经常会指定UA伪装成浏览器发起请求

Cookie 是web浏览器登录网站的凭证,虽然 Cookie 也是请求头的一部分,我们可以从中剥离出来,使用 Cookie 参数指定

当发起一个请求遇到服务器响应非常缓慢而你又不希望等待太久时,可以指定 timeout 来设置请求超时时间,单位是秒,超过该时间还没有连接服务器成功时,请求将强行终止。

一段时间内发送的请求太多容易被服务器判定为爬虫,所以很多时候我们使用代理IP来伪装客户端的真实IP。

如果想和服务器一直保持登录(会话)状态,而不必每次都指定 cookies,那么可以使用 session,Session 提供的API和 requests 是一样的。

使用Requests完成一个爬取知乎专栏用户关注列表的简单爬虫

用 Chrome 找到获取粉丝列表的请求地址

<a href="https://zhuanlan.zhihu.com/api/columns/gooseeker/followers?limit=20&amp;offset=20">https://zhuanlan.zhihu.com/api/columns/gooseeker/followers?limit=20&amp;offset=20</a>

然后我们用 Requests 模拟浏览器发送请求给服务器

这就是一个最简单的基于 Requests 的单线程知乎专栏粉丝列表的爬虫,requests 非常灵活,请求头、请求参数、Cookie 信息都可以直接指定在请求方法中,返回值 response 如果是 json 格式可以直接调用json()方法返回 python 对象

<a href="docs.python-requests.org/en/master/">python-requests 文档</a>

beatifulsoup非python标准库需要单独安装

<a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/">安装使用详情</a>

鲸鱼使用的是ubuntu所以一下几行命令即可

使用BeautifulSoup解析这段代码,能够得到一个 BeautifulSoup 的对象,并能按照标准的缩进格式的结构输出:

这行代码主要可能会发生两种异常:

网页在服务器上不存在(或者获取页面的时候出现错误)

服务器不存在

第一种异常会返回HTTP错误,如:"404 Page Not Found" "500 Internal Server Error",所有类似情况, urlopen函数都会抛出“HTTPError”异常,遇到这种异常,我们可以这样处理:

这个网页中,小说人物对话内容都是红色,人物名称都是绿色

用Requests + Beautifulsoup 爬取 Tripadvisor

服务器与本地的交换机制 --&gt; 爬虫的基本原理

解析真实网页的方法、思路

细心的朋友会发现,这个图片地址都是一个url,这是因为图片地址不在页面的dom结构里面,都是后来js注入的。这也是一种反爬取的手段,我们可以这样解决:

爬取移动端的(前提是反爬不严密)

<a href="http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html#id2">http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html#id2</a>

学习实例

<a href="https://github.com/scrapy/quotesbot">https://github.com/scrapy/quotesbot</a>

多种出生日期写法匹配
email 地址匹配

<code>深度优先(递归实现)</code>:顺着一条路,走到最深处。然后回头

<code>广度优先(队列实现)</code>:分层遍历:遍历完儿子辈。然后遍历孙子辈

--&gt; 关于这些基础算法 请戳鲸鱼之前的文章

<a href="https://segmentfault.com/a/1190000011211679">数据结构与算法:二叉树算法</a>

<a href="https://segmentfault.com/a/1190000010794621">数据结构与算法:图和图算法(一)</a>

<a href="http://blog.csdn.net/zhu_free/article/details/49176777">使用scrapy抓取堆糖图片</a>

自动生成一个文件夹

然后是创建spider,也就是实现具体抓取逻辑的文件,scrapy提供了一个便捷的命令行工具,cd到生成的项目文件夹下执行

<a href="https://www.zhihu.com/search?type=content&amp;q=scrapy%E7%88%AC%E8%99%AB">Scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250</a>

<a href="https://www.cnblogs.com/alan-babyblog/p/5527934.html">豆瓣美女</a>

<a href="https://www.zhihu.com/search?type=content&amp;q=Scrapy%E7%88%AC%E5%8F%96%E8%A7%86%E9%A2%91">利用Scrapy爬取所有知乎用户详细信息并存至MongoDB(附视频和源码)</a>

<a href="http://blog.mtianyan.cn/post/1cc4531e.html">Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章</a>

<a href="https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/debug.html">调试(Debugging)Spiders</a>

这里可以用 

来调试

<code>extract()</code>: 序列化该节点为unicode字符串并返回list。

注意这里的 <code>contains</code>用法

所以spiders下可以这么写

跑下爬虫 debug下

在代码最后打断点,debug下,我们发现抓取 的值都被提取出来了

items相当于把提取的数据序列化

实例化item并填充值

items.py中相当于对数据序列化,而数据传递到pipeline需要在settings.py设置,pipeline中主要做数据存储的

我们在pipelines.py文件中打两个断点debug下,会发现 item中value值就是我们之前提取要储存的

安装还遇到这种问题:

<code>pipeline.py</code>

我们发现只存入了3条,因为上面的代码是同步方式,我爬虫的解析速度是比入数据库速度快的,这造成了堵塞

我们用异步写下:

<a href="http://blog.csdn.net/honglicu123/article/details/75453107">scrapy - Request 中的回调函数不执行</a>

以微信公众号为例,它是封闭的,微信公众平台并没有对外提供 Web 端入口,只能通过手机客户端接收、查看公众号文章,所以,为了窥探到公众号背后的网络请求,我们需要借以代理工具的辅助

主流的抓包工具有:

Windows 平台有 Fiddler

macOS 有 Charles

ubuntu下 可以用 Mono 打开 Fiddler

阿里开源了一款工具叫 AnyProxy

<a href="https://www.jianshu.com/p/4505c732e378">ubuntu下Fiddler抓包</a>

首先要确保你的手机和电脑在同一个局域网,如果不再同一个局域网,你可以买个随身WiFi,在你电脑上搭建一个极简无线路由器

<a href="https://www.jianshu.com/p/be7f8239bb73?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">https://www.jianshu.com/p/be7f8239bb73?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation</a>

<a href="https://zhuanlan.zhihu.com/p/33237247">爬虫小工具-copyheader</a>

<a href="https://kosmoscosmos.gitbooks.io/the-way-to-spyider/">爬虫之路</a>

<a href="http://on891bjlf.bkt.clouddn.com/img/Python%E7%BD%91%E7%BB%9C%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86.pdf">Python网络数据采集</a>

<a href="https://juejin.im/book/5a157c155188254a701eb3c1/section/5a3775556fb9a04501680e9b">基于 Python 实现微信公众号爬虫</a>

<a href="http://blog.csdn.net/qq_30242609/article/details/54581674">用Scrapy shell调试xpath</a>

<a href="https://www.cnblogs.com/zhaof/p/6910871.html">python爬虫从入门到放弃(三)之 Urllib库的基本使用</a>

<a href="https://github.com/mtianyan/ArticleSpider/blob/master/ArticleSpider/spiders/jobbole.py">ArticleSpider/ArticleSpider/spiders/jobbole.py</a>

<a href="https://github.com/scrapy/quotesbot">scrapy/quotesbot 官方简单示例</a>

<a href="http://www.php.cn/python-tutorials-357029.html">详解python3使用PyMysql连接mysql数据库步骤</a>

<a href="http://blog.csdn.net/qq_37176126/article/details/72824106">python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删改查操作</a>