什么是爬虫
网络爬虫也叫网络蜘蛛,是一种“自动化浏览网络”的程序,或者说是一种网络机器人。它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息。简单来讲就是模拟浏览器请求网页。
爬虫的用处
- Web爬虫作为搜索引擎的重要组成部分
- 建立数据集以用于研究,业务和其他目的。比如:
①收集营销数据,对营销方案决策提供辅助。
②分析网民对某件事物的评价,比如新闻事件、电影、书籍等。
③分析行业发展趋势,比如房价、薪资水平。
④社会计算方面的统计和预测,比如票房。
知识准备
http协议
- 常用的请求方法GET、POST等
- 常见的状态码200 OK、400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found、500 Internal Server Error、503 Server Unavailable等
- 常用的请求报头:
前端知识
- 对HTML、CSS、JavaScript等有一定的掌握
爬虫语言
- 选择爬虫用的语言,比如python, 掌握python的基本语法、包的下载与使用
爬虫的基本步骤
目标分析-》发送请求-》解析响应页面-》存储内容-》数据分析
python爬虫用到的库
请求库
- requests: requests库是python的一个第三方请求库,基于urllib库(python用于HTTP请求的自带标准库)改写而成,因此相比urllib库requests更富人性化、便捷性,是爬虫逻辑中使用最频繁的HTTP请求库。
- Selenium:一个自动化测试工具库,利用它可以执行浏览器特定的动作,比如跳转、输入、点击、下拉等。
- aiohttp:提供异步Web服务,提高爬虫...
解析库
- BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库.它将html的标签文件解析成树结构,然后方便的获取到指定标签的对应属性。BeautifulSoup除了支持Python标准库中的HTML解析器之外,还支持一些第三方的解析器,BeautifulSoup官方推荐使用lxml作为解析器。BeautifulSoup()的构造方法需要传入两个参数:
soup = BeautifulSoup("<html>data</html>",'lxml') //第一个参数是一段网页代码或一个网页文件,第二个参数是解析网页的库,这里使用lxml库.
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。
①Tag:Tag 对象与XML或HTML原生文档中的tag相同,比如soup.p表示p标签
②Attributes:一个tag可能有很多个属性. 比如<p class="boldest">
tag的属性的操作方法与字典相同: tag['class']
③find()方法是找到文档中符合条件的第一个元素,直接返回该结果。元素不存在时返回None
④find_all()方法是找到文档中所有符合条件的元素,以列表的形式返回。元素不存在时返回空列表
⑥CSS选择器的使用方法与CSS定位标签的方式相似,主要有.class 和 #id
- 使用正则表达式,python中的re模块可使用正则表达式进行匹配。
- pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析html文档
存储内容
数据分析库
- jieba:是目前最好的 Python 中文分词组件,支持 3 种分词模式:精确模式、全模式、搜索引擎模式,同时支持繁体分词、自定义词典。
- numpy:高性能科学计算和数据分析的基础包,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
- pandas:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
- matplotlib 数据可视化工具,可生成各种2D图像。
简单示例
环境搭建
- 安装python3.6.5
- 使用pip install xx 命令依次安装requests、lxml、beautifulsoup4、jieba、numpy、pandas、matplotlib、wordcloud
初阶爬虫示例介绍
requrl = 'https://movie.douban.com/subject/' + movieId + '/comments' +'?' +'start=' + str(start) + '&limit=20'
response = requests.get(requrl) #发送请求
if response.status_code == 200:
html = response.text # 获取响应html内容
soup = BeautifulSoup(html, 'lxml') # 构建BeautifulSoup对象,使用lxml作为解析器
comment_div_lits = soup.find_all('div', class_='comment') # 找到对应标签及属性
for item in comment_div_lits: # 循环
comment = item.find_all('span', class_='short')[0].string # 获取评论内容
eachCommentList.append(comment) # 添加到list列表
return eachCommentList # 返回列表
爬虫框架scrapy
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛,用户只需要定制开发几个模块就可以轻松的实现一个爬虫。Scrapy 使用了 Twisted'twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
scrapy组件列表
- Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
- Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
- Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
- Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
- Downloader Middlewares(下载中间件):位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- Spider Middlewares(Spider中间件):介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
scrapy运行流程
- 1、引擎启动触发事务
- 2、引擎从调度器中取出一个链接(URL)用于接下来的抓取
- 3、引擎把URL封装成一个请求(Request)传给下载器
- 4、下载器把资源下载下来,并封装成应答包(Response)
- 5、爬虫解析Response
- 6、解析出的实体(Item),则交给实体管道进行进一步的处理
- 7、解析出的是链接(URL),则把URL交给调度器等待抓取
创建项目步骤
- 1、使用pip install xx命令安装scrapy、Twisted(异步网络框架处理网络通讯)
- 2、进入您打算存储代码的目录中,运行下列命令:scrapy startproject tutorial # tutorial为项目名称,自行定义
该命令将会创建包含下列内容的 tutorial 目录:
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件分别是:
- scrapy.cfg: 项目的配置文件
- tutorial/: 该项目的python模块
- tutorial/items.py: 项目的目标实体文件
- tutorial/pipelines.py: 项目的管道文件.
- tutorial/settings.py: 项目的设置文件.
- tutorial/spiders/: 存储爬虫代码目录
spiders目录下新建爬虫文件:
import scrapy
class testSpider(scrapy.Spider):
name = "tutorial"
allowed_domains = ["baidu.com"]
start_urls = (
'https://www.baidu.com/',
)
def parse(self, response):
pass
反爬虫与反反爬虫介绍
常见的反爬虫
1、通过网页的请求头
- User-Agent:这个是保存用户访问该网站的浏览器的信息,例如Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36,requests库本身的headers里没有User-Agent,所以网站可以拒绝掉没有User-Agent或者频繁使用一个User-Agent的请求。
- Referer:当浏览器发送请求时,一般都会带上这个,表示当前请求是由哪个链接进来的。网站也可以拒绝没有Referer或者频繁使用同个Referer的请求。
- authorization:有的网站还会有这个请求头,这个是在用户在访问该网站的时候就会分配一个id给用户,然后在后台验证该id有没有访问权限从而来进行发爬虫。
2、用户访问网站的ip
当不断地使用一个ip来访问一个网站时,网页后台也会判断你是一个机器,把你的ip封掉。
3、验证码
当频繁请求一个网址,比如登录时,会出现验证码。
反反爬虫策略
1.添加请求头
在请求头headers添加请求头,比如可以网上找别人整理的User-Agent列表,请求时从列表里随机取出使用。
2.使用代理ip
网上有一些免费的代理ip,比如https://www.xicidaili.com/等,但使用的人太多了也经常被封掉,可以自己爬取一些免费代理ip建成ip池,请求的时候从ip池随机取出使用。也可以购买付费的ip,质量比较高。
3.处理验证码
对于比如登录时只要验证一次的简单图片验证码,可以把验证码图片下载下来,手动输入;对于类似滑块验证码,可以用selenium库模拟用户滑动解锁;对于更复杂的验证码可接入收费的打码平台。