我们先自己想象一下平时到天猫商城购物(PC端)的步骤,可能就是打开浏览器==》搜索天猫商城==》点击链接进入天猫商城==》选择所需商品类目(站内搜索)==》浏览商品(价格、详情参数、评论等)==》点击链接==》进入下一个商品页面,……这样子周而复始。当然这其中的搜索也是爬虫的应用之一。简单讲,网络爬虫是类似又区别于上述场景的一种程序。
- 分类与关系一般最常用的爬虫类型主要有通用爬虫和聚焦爬虫,其中聚焦爬虫又分为浅聚焦与深聚焦,三者关系如下图:
网络爬虫可以做的事情很多,如以下列出:
- 搜索引擎
- 采集数据(金融、商品、竞品等)
- 广告过滤
- ……
其实就我们个人兴趣,学完爬虫我们可以看看当当网上哪种技术图书卖得比较火(销量、评论等信息)、看某个在线教育网站哪门网络课程做得比较成功、看双十一天猫的活动情况等等,只要我们感兴趣的数据,一般的话都可以爬取得到,不过有些网站比较狡猾,设置各种各样的反扒机制。总而言之,网络爬虫可以帮助我们做很多有趣的事情。
个人建议本章除3.3以外,其他内容可以大致先看一下,有些许印象即可,等到后面已经完成一些简单爬虫后或者在写爬虫过程中遇到一些问题再回头来巩固一下,这样子或许更有助于我们进一步网络理解爬虫。
HTTP 协议是爬虫的基础,通过封装 TCP/IP 协议链接,简化了网络请求的流程,使得用户不需要关注三次握手,丢包超时等底层交互。
关于HTTP协议可以参考一下博文:
- HTTP 请求方法对照表
- HTTP 响应头和请求头信息对照表
- HTTP 状态码对照表
- HTTP Content-type 对照表
作为新手,个人觉得入门的话懂一点HTML与Javascript就可以实现基本的爬虫项目,HTML主要协助我们处理静态页面,而实际上很多数据并不是我们简单的右击查看网页源码便可以看到的,而是存在JSON(Javascript Object Notation)文件中,这时我们便需要采取抓包分析,详见《5.2 爬取基于Ajax技术网页数据》。
- HTML 教程
- Javascript 教程
做爬虫必不可少的步骤便是做解析。正则表达式是文本匹配提取的利器,并且被各种语言支持。XPath即为XML路径语言,类似Windows的文件路径,区别就在XPath是应用在网页页面中来定位我们所需内容的精确位置。具体用法参考以下资料:
- 正则表达式教程
- Python3如何优雅地使用正则表达式
- XPath教程
Python 是一种十分便利的脚本语言,广泛被应用在各种爬虫框架。Python提供了如urllib、re、json、pyquery等模块,同时前人又利用Python造了许许多多的轮,如Scrapy框架、PySpider爬虫系统等,所以做爬虫Python是一大利器。
- 说明:本章开发环境细节如下
- 系统环境:windows 8.1
- 开发语言:Python3.5
- 开发工具:Spyder、Pycharm
- 辅助工具:Chrome浏览器
Python3中,只有Unicode编码的为str,其他编码格式如gbk,utf-8,gb2312等都为bytes,在编解码过程中字节bytes通过解码方法decode()解码为字符串str,然后字符串str通过编码方法encode()编码为字节bytes,关系如下图:
4.4.1 网络爬虫中处理异常的种类与关系
- URLError通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。
- HTTPError首先我们要明白服务器上每一个HTTP 应答对象response都包含一个数字“状态码”,该状态码表示HTTP协议所返回的响应的状态,这就是HTTPError。比如当产生“404 Not Found”的时候,便表示“没有找到对应页面”,可能是输错了URL地址,也可能IP被该网站屏蔽了,这时便要使用代理IP进行爬取数据,关于代理IP的设定我们下面会讲到。
- 两者关系两者是父类与子类的关系,即HTTPError是URLError的子类,HTTPError有异常状态码与异常原因,URLError没有异常状态码。所以,我们在处理的时候,不能使用URLError直接代替HTTPError。同时,Python中所有异常都是基类Exception的成员,所有异常都从此基类继承,而且都在exceptions模块中定义。如果要代替,必须要判断是否有状态码属性。
4.4.2 Python中有一套异常处理机制语法
- try-except语句
- try-except-finally语句Python
import urllib.request
import urllib.error
import traceback
import sys
try:
except Exception as er1:
import urllib.request
import urllib.error
try:
except urllib.error.URLError as er2:
import urllib.request
import urllib.error
try:
except urllib.error. HTTPError as er3:
|
Exception异常捕获输出结果如下:
异常概要:
HTTP Error 403: Forbidden
异常类型:
异常信息或参数:HTTP Error 403: Forbidden
调用栈信息的对象:
已从堆栈中“辗转开解”的函数有关的信息:None
|
一般客户端需要通过HTTP请求才能与服务端进行通信,常见的HTTP请求有POST与GET两种。例如我们打开淘宝网页后一旦HTML加载完成,浏览器将会发送GET请求去获取图片等,这样子我们才能看到一个完整的动态页面,假如我们浏览后需要下单那么还需要向服务器传递登录信息。
- GET方式向服务器发索取数据的一种请求,将请求数据融入到URL之中,数据在URL中可以看到。
- POST方式向服务器提交数据的一种请求,将数据放置在HTML HEADER内提交。从安全性讲,POST方式相对于GET方式较为安全,毕竟GET方式是直接将请求数据以明文的形式展现在URL中。
- 实战——登录CSDN/百度搜索简书
cookies是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
参考:零基础自学用Python 3开发网络爬虫(四): 登录
- 原理浏览器伪装是防屏蔽的方法之一,简言之,其原理就是在客户端在向服务端发送的请求中添加报头信息,告诉服务器“我是浏览器”
- 如何查看客户端信息?通过Chrome浏览器按F12==》选择Network==》刷新后点击Name下任一个地址,便可以看到请求报文和相应报文信息。以下是在百度上搜索简书的请求报文信息,在爬虫中我们只需添加报头中的User-Agent便可实现浏览器伪装。
- 实战——代理服务器爬取百度首页
- Ajax(异步加载)的技术网站中用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中。简单讲就是打开网页,先展现部分内容,再慢慢加载剩下的内容。显然,这样的网页因为不用一次加载全部内容其加载速度特别快,但对于我们爬虫的话就比较麻烦了,我们总爬不到我们想要的内容,这时候就需要进行抓包分析。
- 抓包工具推荐Fiddler与Chrome浏览器
- 实战请转《5.2 爬取基于Ajax技术网页数据》。
一般我们程序是单线程运行,但多线程可以充分利用资源,优化爬虫效率。实际上Python 中的多线程并行化并不是真正的并行化,但是多线程在一定程度上还是能提高爬虫的执行效率,下面我们就针对单线程和多线程进行时间上的比较。
- 实战——爬取豆瓣科幻电影网页
- 结果:
- 更多详情请参考:Python 并行任务技巧Python中的多进程处理
- 本地文件(excel、txt)
- 数据库(如MySQL)
备注:具体实战请看5.1
在登录过程中我们常遇到验证码问题,此时我们有必要对其进行处理。
- 简单验证码识别利用pytesser识别简单图形验证码,有兴趣的童鞋,请参考Python验证码识别。
- 复杂验证码识别这相对有难度,可以调用第三方接口(如打码兔)、利用数据挖掘算法如SVM,有兴趣参考字符型图片验证码识别完整过程及Python实现
(1)需求
爬取豆瓣网出版社名字并分别存储到excel、txt与MySQL数据库中。
(2)分析
- 查看源码
- Ctrl+F搜索任意出版社名字,如博集天卷
- 确定正则模式
(3)思路
- 下载目标页面
- 正则匹配目标内容
- Python列表存储
- 写入Excel/txt/MySQL
(4)源码
'''信息存储'''
import urllib
import re
import xlsxwriter
import MySQLdb
def gxls_concent(target_url,pat):
def wxls_concent(ret_xls,ret_concent):
def wtxt_concent(ret_txt,ret_concent):
def mainXlsTxt():
def db_con():
def exeSQL(sql):
def gdb_concent(target_url,pat):
def wdb_concent(tbl_name,ret_concent):
def mainDb():
if name == 'main':
|
(5)结果
(2)分析
- 岗位数据在哪里?打开拉勾网==》输入关键词“数据挖掘”==》查看源码==》没发现岗位信息打开拉勾网==》输入关键词“数据挖掘”==》按F12==》Network刷新==》按下图操作
- Json数据结构怎么样?
5.3.1 了解Scrapy
Scrapy使用了Twisted异步网络库来处理网络通讯。整体架构大致如下(注:图片来自互联网):
5.3.2 Scrapy自动爬虫
前面的实战中我们都是通过循环构建URL进行数据爬取,其实还有另外一种实现方式,首先设定初始URL,获取当前URL中的新链接,基于这些链接继续爬取,直到所爬取的页面不存在新的链接为止。
(1)需求
采用自动爬虫的方式爬取糗事百科文章链接与内容,并将文章头部内容与链接存储到MySQL数据库中。
(2)分析
- 怎么提取首页文章链接?打开首页后查看源码,搜索首页任一篇文章内容,可以看到”/article/118123230″链接,点击进去后发现这就是我们所要的文章内容,所以我们在自动爬虫中需设置链接包含”article”
-
- 链接打开任一详情页,复制详情页链接,查看详情页源码,搜索链接如下:
(3)项目源码
创建爬虫项目
打开CMD,切换到存储爬虫项目的目录下,输入:
定义items
import scrapy
class QsbkautoItem(scrapy.Item):
|
编写爬虫
- qsbkauto.py
- pipelines.py
- setting.py关闭ROBOTSTXT_OBEY设置USER_AGENT开启ITEM_PIPELINES
执行爬虫
scrapy crawl qsbkauto --nolog