概念
- 网络爬虫也被称为网络蜘蛛、网络机器人,是一个自动下早网页的计算机程序或自动化脚本
- 网络爬虫就像一只蜘蛛一样在互联网上沿着URL的丝线爬行,下载每一个URL所指向的网页,分析页面的内容
网页结构
- HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,它是客户端浏览器与Web服务器之间的通信协议,用来实现服务器端和客户端的信息传输
- URL是Uniform Resource Locator(统一资源定位符)的缩写,是Internet的万维网服务程序上用于指定信息位置的表示方法。Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,俗称“网址”
- HTML是Hyper Text Markup Language(超文本标记语言)的缩写,它是构成网页文档的主要语言,是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体
HTTP协议
HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
http://host[:port][path]
- host:合法的Internet主机域名或IP地址
- port:端口号,缺省端口为80
- path:请求资源的路径
HTTP协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取url位置的资源 |
HEAD | 请求获取url位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向url位置的资源后附加新的数据 |
PUT | 请求向url位置存储一个资源,覆盖原来url位置的资源 |
PATCH | 请求局部更新url位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除url位置存储的资源 |
HTML的基本结构
<html>
<head>
<title>页面标题</title>
</head>
<body>
页面正文
</body>
</html>
爬虫的分类
按尺寸分类
规模 | 爬取速度 | 爬取范围 | 解决方案 |
---|---|---|---|
小规模,数据量小 | 不敏感 | 网页 | Request库 |
中规模,数据规模较大 | 敏感 | 网站 | Scrapy库 |
大规模,搜索引擎 | 关键 | 全网 | 定制开发 |
按原理分类
- 通用网络爬虫
- 聚焦网络爬虫
- 增量式网络爬虫
- 深层网络爬虫
- 通用网络爬虫又称为全网爬虫,其爬行对象由一批种子URL扩充至整个Web,该类爬虫比较适合为搜索引擎搜索广泛的主题,主要有Google、百度等搜索引擎,核心功能包括访问网页,爬取数据,数据存储,数据处理,提供检索服务
深度优先策略:按照深度由低到高的顺序,依次访问下一级网页链接,直到无法深入为止
广度优先策略:按照网页内容目录层次的深浅来爬行,优先爬取较浅层次的页面,当同一层中的页面全部爬取完毕后,爬虫再深入下一层
爬虫的合法性
目前,多数网站允许将爬虫爬取的数据用于个人使用或科学研究,但如果将爬取的数据用于其他用途,尤其是转载或者商业用途,严重的将会触犯法律或者引起民事纠纷
有两种数据不能进行爬取,更加不能用于商业用途
- 个人隐私数据:如姓名、手机号码、年龄、血型、婚姻情况等,爬取此类数据将会触犯个人信息保护法
- 明确禁止他人访问的数据:例如用户设置了账号密码等权限控制,进行了加密的内容
还需要注意版权相关的问题,有作者署名的受版权保护的内容不允许爬取后随意转载或用于商业用途
robot.txt协议
- 概念:当使用一个爬虫爬取一个网站的数据时,需要遵循网站所有者针对所有爬虫所指定的协议
- robots歇息并不是规范,而只是约定俗成的,所有并不能保证网站的隐私
- 查看方法:网站根目录URL+/robots.txt
反爬虫
- 概念:限制爬虫程序访问服务器资源和获取数据的行为称为反爬虫
- 限制手段包括但不限于请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术
-
常见爬虫手段:
- 通过User-Agent效验反爬
- 通过访问频度反爬
- 通过验证码效验反爬
- 通过变换网页结构反爬
- 通过账号权限fanpa
爬虫相关库
类型 | 库名 | 简介 |
---|---|---|
通用 | urllib | python内置的HTTP请求库,提供一系列用于操作URL的功能 |
通用 | requests | 基于urllib,采用Apache2 Licensed 开源协议的HTTP库 |
通用 | urllib3 | 提供很多python标准库里所没有的重要特性:线程安全、连接池、客户端SSL/TLS验证、文件分部编码上传、协助处理重复请求和HTTP重定向、支持压缩编码、支持HTTP和SOCKS代理、100%测试覆盖率 |
框架 | scrapy | 一个为了爬取网站数据,提取结构性数据而编写的应用框架 |
HTML/XML解析器 | lxml | C语言编写高效HTML/XML处理库(支持XPath) |
HTML/XML解析器 | BeautifulSoup4 | 纯Python实现的HTML/XML处理库,效率相对较低 |
requests库爬虫
基本处理流程
- 发起请求
通过URL向服务器发起request请求,请求可以包含额外的header信息
- 获取响应内容
如果服务器正常响应会收到一个response(所请求的网页的内容),如HTML、JOSN字符串或者二进制的数据(视频、图片)等
-
解析内容
- HTML代码,网页解析器解析
- JOSN数据,转换成JOSN对象
- 二进制的数据,保存到文件
保存数据
保存到本地文件或保存到数据库(MySQL、Redis、MongoDB)
设计思路
- 获取URL,确定要爬取的URL
- 访问,模拟浏览器通过HTTP协议访问URL,获取服务器返回的HTML代码
- 解析,解析HTML字符串(根据一定规则提取需要的数据)
安装requests库
管理员身份运行cmd,执行pip install requests
7个主要方法
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应HTTP的POST |
requests.put() | 向HTML网页提交PUT请求的方法,对应HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应HTTP的DELETE |
操作方法
r = requests.get(method, url, **kwargs)
# method:请求方式,对应get/put/post等七种
# url:获取页面的URL链接
# **kwargs:控制访问的参数,共13个
r 返回一个包含服务器资源的Response对象,Response对象包含服务器返回的所有信息,也包含请求的Request信息
requests.get(url) 构造一个向服务器请求资源的Request对象
Response对象的属性
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态 |
r.text | HTTP响应内容的字符串形式,即URL对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容的编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
异常
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TOOManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
案例
# 京东商品页面的爬取 https://www.jd.com/
import requests
import ssl
# HTTPS是HTTP的安全版,再HTTP上加入了SSL层,对应端口号为443
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
print(r.text)
except:
return "异常"
if __name__ == "__main__":
url = input("请输入网址>>>:")
print(getHTMLText(url))
# 百度关键词接口
import requests
import ssl
keyword = input("请输入关键词>>>:")
try:
kv = {"wd":keyword}
r = requests.get("https://www.baidu.com/s", params = kv)
print(r.request.url)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
print(len(t.text))
except:
return "异常"
BeautifulSoup解析网页
BeautifulSoup提供简单的、Python式的函数用来处理导航、搜索、修改分析树功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据
BeautifulSoup已成为和lxml、html5lib一样出色的python解析器
BeautifulSoup将复杂的HTML文档转换成树形结构,每个节点都是Python对象。解析网页的核心可以归结为两点:获取节点和从节点中获取信息
安装BeautifulSoup库
- 以管理员身份运行cmd,输入 pip install beautifulsoup4
库引用
Beautiful Soup库也叫beautifulsoup4 或bs4
from bs4 import BeautifulSoup
import bs4
基本元素
<p class = "title"></p>
# p是标签Name,通常是成对出现
# class = "title"是属性Attributes,可以是0或者多个
格式输出
bs4库的prettify()方法
.prettify()为html文本<>及内容增加'\n'
.prettify()可用于标签,方法:<tag>.prettify()
示例
import requests
import ssl
import bs4
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
print(demo)
soup = bs4.BeautifulSoup(demo, "html.parser")
print(soup)
print(soup.prettify()) # html格式输出方法
pandas库爬虫及数据可视化
pandas库爬虫
pandas适合抓取Table表格型数据
正对这类<table>表格数据,pandas库为我们提供了一种简便准确的爬取工具:read_html方法
-
爬取条件
- 网页是静态网站
- 是table表格数据
安装
以管理员身份运行cmd,输入 pip install pandas
read_html方法
pandas.read_html(io, match=".+", flavor=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None, thousands=",", encoding=None, decimal=".", converters=None, na_values=None, keep_default_na=True, displayed_only=True)
# io:str,path object or file-like object;
# match:str或正则表达式,匹配模式
# flavor:解析器
# header:标题行
# attrs:属性
# Returns:list of DataFrames(pandas有额外两种数据类型series和DataFrames)
示例
# 爬取财富排行榜
import pandas as pd
# 中国500强
url = "http://www.fortunechina.com/fortune500/c/2020-07/27/content_369925.htm"
df = pd.read_html(url,header=0)[0] # 把第一行作为表头,[0]指抓取页面的第一个表格
print(df)
df.to_excel("财富中国500强.xlsx") # 输出为表格