爬虫
网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序。众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容。
爬虫结构大概顺序
- 获取URL
- 对URL进行解析,得到网页内容
- 获取需要字段信息
- 存储信息
爬虫的分类
- 通用爬虫:获取一整张页面数据
- 聚焦爬虫:根据指定的需求获取页面中指定的局部数据
- 增量爬虫:用来监测网站数据更新的情况,爬取网站最新更新出来的数据
反爬机制:网站可以采取相关的技术手段或者策略组织爬虫程序进行网站数据的爬取
反反爬策略:让爬虫程序通过破击反扒机制获取数据。
什么是HTTP协议:client和server进行数据交互的形式。
HTTPs协议:是安全的HTTP协议。
- 对称密钥加密:客户端向服务器端发送消息,客户端首先根据已知的加密算法对信息进行加密,接收端对加密信息进行解密的时候需要用到密钥,客户端会将解密的密钥跟着所要发送消息一起发送给服务器端(加密和解密的密钥是一样的),密钥在传输的过程中有被拦截的隐患,所以对称加密的加密方式是不安全的。
- 非对称密钥加密:在非对称加密方式使用的时候,首先服务器端会产生一对密钥,一把是‘公开密钥’,一把是‘私有密钥’,首先,服务器端会将公开密钥发送给客户端,客户端根据公开密钥对数据进行加密,之后传输给服务器,服务器根据私有密钥对数据进行解密。这样的好处是,没有私有密钥就不会解开文件,避免了数据被挟持的隐患。但是其也有缺点:第一个就是不能保证客户端接收到的公开密钥就是服务器端发送的密钥。第二个是他的效率比较低下,因为他处理起来更加的麻烦,通信过程中使用就有一定的效率问题而影响通信速度。
- 证书密钥加密:服务器端的开发者携带公开密钥,像数字证书认证机构提出公开密钥的申请,数字证书认证机构在认清申请者身份后,审核通过,在公开密钥中做数字签证,然后分配这个已签名的公开密钥,并将密钥放在证书里面兵丁在一起。然后服务器将这份数字证书发送给客户端,因为客户端也认可证书机构,客户端可以通过数字证书中的数字签名来验证公钥的真伪,来确保服务器传过来的密钥是真实准确的。一旦确认之后,客户就会通过公约对报文进行加密发送,服务器接收到以后用自己的私钥进行解密。
爬虫使用到的头部信息:
- User-Agent:请求载体的身份标识;
- Connection:‘keep-alive’,‘close’;
- content-type:表示服务器端返回客户端的数据类型。
requests模块
通常爬虫使用的模块从大方面来说,可以分为两种方法:
-
Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的 API 太渣了。操作起来比较麻烦它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
-
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
当使用到urllib
的时候,会用到select()
方法,来找网页中的标签,而通过BeautifulSoup
则使用的时find()
方法,找到的是标签的值。
requests模块使用流程
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
一个简单的例子:
import requests
#指定url
url = 'https://www.sougou.com'
#发起请求
respons = requests.get(url)
#获取响应数据
page_text = respons.text #返回字符串类型的数据
print(page_text)
with open('./sogou.html','w',encoding = 'utf-8') as f:
f.write(page_text)
print('Done!')
爬取一个简单网页
import requests
from bs4 import BeautifulSoup
response = requests.get('https://www.autohome.com.cn/')
response.encoding = 'utf-8' #设置网页编码
text = response.text #打印网页信息
# print(text)
soup = BeautifulSoup(text,'html.parser') #BeautufulSoup把网页信息处理成一块一块的对象信息,以便可以从中找到html标签。
div = soup.find(name = 'div',attrs = {'id':'content_section1'})
li_list = div.find_all(name = 'li')
for li in li_list:
a_list = li.find_all(name = 'a')
for a in a_list:
if not a:
continue
href = a.get('href')
print(href)
参考博客:
http://www.cnblogs.com/wupeiqi/
https://blog.csdn.net/qq_38520096/article/details/79189161