什么是爬虫
爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程。
哪些语言可以实现爬虫
php:可以实现爬虫,但是php在实现爬虫中支持多线程和多进程方面做的不好。
java:可以实现爬虫。java可以非常好的处理和实现爬虫,是唯一可以与python并驾齐驱且是python的头号劲敌。但是java实现爬虫代码较为臃肿,重构成本较大。
c/c++:可以实现爬虫。但是使用这种方式实现爬虫纯粹是是某些人(大佬们)能力的体现,却不是明智和合理的选择。
python:可以实现爬虫。python实现和处理爬虫语法简单,代码优美,支持的模块繁多,学习成本低,具有非常强大的框架(scrapy等)!
爬虫的分类
通用爬虫
通用爬虫是搜索引擎(Baidu、Google、Yahoo等)“抓取系统”的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。 简单来讲就是尽可能的;把互联网上的所有的网页下载下来,放到本地服务器里形成备分,在对这些网页做相关处理(提取关键字、去掉广告),最后提供一个用户检索接口。
聚焦爬虫
聚焦爬虫是根据指定的需求抓取网络上指定的数据。例如:获取豆瓣上电影的名称和影评,而不是获取整张页面中所有的数据值。
robots.txt协议
如果自己的门户网站中的指定页面中的数据不想让爬虫程序爬取到的话,那么则可以通过编写一个robots.txt的协议文件来约束爬虫程序的数据爬取。robots协议的编写格式可以观察淘宝网的robots(访问www.taobao.com/robots.txt即可)。但是需要注意的是,该协议只是相当于口头的协议,并没有使用相关技术进行强制管制(防君子不防小人).
反爬虫
门户网站通过相应的策略和技术手段,防止爬虫程序进行网站数据的爬取。
反反爬虫
爬虫程序通过相应的策略和技术手段,破解门户网站的反爬虫手段,从而爬取到相应的数据。
requests模块
requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着重要的地位。
请求载体身份标识的伪装:
- User-Agent:请求载体身份标识,通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。可以通过判断该值来获知该请求的载体究竟是基于哪款浏览器还是基于爬虫程序。
- 反爬机制:某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。
- 反反爬策略:将爬虫程序的UA伪装成某一款浏览器的身份标识。
使用
1 | requests.get(url, params,data, headers, proxies) # url地址/get携带的参数/post的参数/请求头信息/代理 |
正解解析
常用正则表达式
常用元字符
. | 匹配除换行符以外的任意字符 |
---|---|
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常用限定符
* | 重复零次或更多次 |
---|---|
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
常用反义词
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
---|---|
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
特殊(包括python的re模块)
(ab) | 分组 |
---|---|
.* | 贪婪匹配 |
.*? | 惰性匹配 |
re.I | 忽略大小写 |
re.M | 多行匹配 |
re.S | 单行匹配 |
re.sub | 正则表达式, 替换内容, 字符串 |
Xpath解析
常用xpath表达式
1 | # 属性定位: |
etree
1 | from lxml import etree |
使用
1 | # 使用xpath对url_conten进行解析 |
BeautifulSoup解析
1 | from bs4 import BeautifulSoup |
使用
1 | soup = BeautifulSoup('字符串类型或者字节类型', 'lxml') |
图片懒加载
图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。
实现
在网页源码中,在img标签中首先会使用一个“伪属性”(通常使用src2,original……)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。
图片验证码
云打码/打码兔
处理验证码的实现流程
对携带验证码的页面数据进行抓取
可以将页面数据中验证码进行解析,验证码图片下载到本地
可以将验证码图片提交给三方平台进行识别,返回验证码图片上的数据值
云打码平台:
- 在官网中进行注册(普通用户和开发者用户)
- 登录开发者用户:
- 实例代码的下载+开发文档
- 创建一个软件
- 使用示例代码中的源码文件中的代码进行修改,让其识别验证码图片中的数据值
1 | #该函数就调用了打码平台的相关的接口对指定的验证码图片进行识别,返回图片上的数据值 |
用云打码+session爬取人人网个人信息页
1 | import urllib |
selenium
selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作。
而我们就可以通过浏览器的自动化操作应付懒加载类问题.
浏览器的驱动程序(以谷歌浏览器为例)
谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
版本映射表: http://blog.csdn.net/huilan_same/article/details/51896672
使用
find_element_by_id 根据id找节点
find_elements_by_name 根据name找
find_elements_by_xpath 根据xpath查找
find_elements_by_tag_name 根据标签名找
find_elements_by_class_name 根据class名字查找driver.find_element_by_link_text() 定位文字链接
switch_to.frame(‘login_frame’) 定位到一个具体的iframe
1 | from selenium import webdriver |
1 | # 打开窗口 |
phantomJs
PhantomJS是一款无界面的浏览器,其自动化操作流程和上述操作谷歌浏览器是一致的。由于是无界面的,为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。(因为我们不可能让用户去看着浏览器自动操作,所以要用无界面)
1 | from selenium import webdriver |
谷歌无头浏览器
由于PhantomJs最近已经停止了更新和维护,所以推荐大家可以使用谷歌的无头浏览器,是一款无界面的谷歌浏览器。
1 | from selenium import webdriver |
session处理cookie
cookie概念
:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。
cookie作用
:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。
所以有时爬取到文件中的数据,不是个人页面的数据,而是登陆的首页面
使用
1 | import requests |
代理
一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一段时间换一个代理IP,就算IP被禁止,依然可以换个IP继续爬取。
代理的分类:
- 正向代理:代理客户端获取数据。正向代理是为了保护客户端防止被追究责任。
- 反向代理:代理服务器提供数据。反向代理是为了保护服务器或负责负载均衡。
免费代理ip提供网站
- http://www.goubanjia.com/
- 西祠代理
- 快代理
使用
1 | #不同的代理IP |
线程池
基于线程池的爬取
1 | import requests |