Python可以高效开发网络爬虫,可用于信息搜集、数据分析、网站投票等功能。
文章介绍Python网络爬虫的基础概念和常用模块,爬虫实例参考文章:Python爬虫实例
一、基础概念
(一) 定义
网络爬虫,是一种按照一定规则,通过模拟客户端发送网络请求和接收响应,自动抓取网页信息的程序。只要是浏览器能做的事情,原则上爬虫都可以做。
我们常用的搜索引擎就是一个大规模的爬虫,获取的海量信息存储在数据库,当用户输入关键字进行查询时,搜索引擎通过索引快速返回结果。
(二) 分类
1.通用爬虫
通常指搜索引擎爬虫,基本工作原理:种子url列表抓取网页—数据存储—预处理提取关键信息—提供检索服务—网站排名(根据引用次数、点击次数等)
2.聚焦爬虫
针对特定网站的爬虫,基本工作原理:url列表—响应内容—提取url—提取数据—数据存储
当前页面的数据来源主要有三种:
-
对当前url请求对应的响应中
-
对其他url请求对应的响应中,比如ajax请求
-
响应中的js脚本动态生成
只有第一种数据才可以通过爬虫获取,因为当前url地址呈现的内容和url请求直接获取的响应不一定相同,响应中可能会通过js动态加载一些图片、样式,而当前页面呈现的是这些内容加载后的结果。
二、常用模块
爬虫核心功能即模拟客户端行为发送请求,然后从响应信息中提取数据。发送请求过程最常用到的模块为 requests
,提取数据过程可以根据网页结构和属性提取,使用模块 BeautifulSoup
,也可以通过正则表达式提取,使用模块 re
。
(一) requests
1.基本使用
Python通用网络爬虫可以完成爬虫90%的工作,主要涉及requests模块的使用,requests的底层实现就是urllib,而且在Python2和Python3中通用。
requests对象的方法主要包括:request、get、post、head等,具体如下:
方法 | 含义 | 类型 |
---|---|---|
request(method, url, **kwargs) | 发送http请求,具体方法由method指定 | Response |
get(url, **kwargs) | 发送http get方法请求 | Response |
post(url, **kwargs) | 发送http post方法请求 | Response |
head(url, **kwargs) | 发送http head方法请求 | Response |
方法中url
为访问的网页url,**kwargs
为控制访问的参数,共13个:
- headers:请求头
- params:请求参数
- data:请求数据
- cookies:携带cookies
- json:JSON格式的请求数据
- files:传输文件
- timeout:请求超时时间,单位为秒
- proxies:请求代理
- allow_redirects:重定向,值为bool类型,默认为True
- stream:获取内容立即下载,值为bool类型,默认为True
- verify:认证SSL证书,值为bool类型,默认为True
- cert:本地SSL证书
- auth:支持HTTP认证
Response对象的常用属性:
属性 | 含义 | 类型 |
---|---|---|
text | content经过解码的数据 | str |
content | Response的原始byte数据,没有经过解码 | bytes |
status_code | 返回请求状态码 | int |
headers | Response头信息 | dict |
request.xxx | 返回对应的请求的方法和属性 |
注意:
- response.text默认是ISO-8859-1编码 (可通过response.encoding查看),显示内容可能出现乱码,如果需要指定编码需要使用response.encoding="utf-8"指定,或者使用response.content.decode(“utf-8”),默认utf-8解码
- 网页返回一整行json格式数据时,可以利用pycharm中
Code-> Code Reformat Code
,或者使用BeautifulSoup对象的prettify方法调整格式,使代码更易读 - response.request.url与response.url不一定相同,比如重定向网站
- request请求包中headers中User-Agent默认是
python-requests/xxxxx
,这导致很多网站返回结果与普通浏览器访问的不同,因此有必要在headers中模拟浏览器重新指定User-Agent - 爬虫要模仿浏览器的合法请求,并不是所有请求参数