主要知识点:
网络连接:
根据图2.1我们可以知道计算器通过向服务器发送Request请求,可以得到相应的Response。其中Request包括请求头和消息体,Response包括html文件。其实计算机的一次Request请求和服务器的一次应答就是网络连接的体现。
其中我们可以把计算机比作向商店购买产品的消费者,当消费者去商店购买产品离开时,他应该给结账员自己所购买的商品的硬币,其中硬币可类比于请求头,商品可类似于消息体。而结账员就相当于服务器。经过结账源处理后,消费者可以得到所购买的产品,即Response。
爬虫原理:
通过对网络连接的简单了解,我们可以归纳出爬虫就是模拟计算机对服务器发起Request请求,得到服务器端的Request内容并解析提取对自己有用的信息。由于互联网错综复杂,一次简单的模拟网络连接不能批量的获取网页数据。因此就出现了多页面和跨页面爬虫流程。
1.多页面网页爬虫流程
有的网页存在多页的情况时,每个网页结构都相同或者类似,这种类型的网页爬虫流程为:
1.手动翻页并观察各页面的的URL构成特变,构造出所有页面的URL存入列表
2.根据URL列表依次循环取出URL。
3.定义爬虫函数。
4.循环调用爬虫函数,存储数据
5.循环完毕,结束爬虫。
2.跨页面爬虫流程
跨页面的爬虫流程:
1.定义爬取函数爬取列表页的所有专题的URL
2.将专题URL存入列表中。
3.定义爬取详细页数据函数
4.进入专题详细页面爬取详细函数。
5.存储数据,循环完毕,结束爬虫。
爬虫的任务就是两件事:请求网页和解析提取信息
爬虫三大库 Requests Lxml BeautifulSoup
Requests库:请求网站获取网页数据
import requests
#from bs4 import BeautifulSoup
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400"}
res=requests.get("http://bj.xiaozhu.com/",headers=headers)
#soup = BeautifulSoup(res.text, 'html.parser')
try:
#price=soup.select("#page_list > ul > li > div.result_btm_con.lodgeunitname > div > span > i")
print(res)
print(res.text)
#print(soup.prettify())
#print(price)
except ConnectionError:
print("拒绝连接")
其中<Response [200]>表示请求网页成功
User-Agent可以通过http://www.user-agent.cn/ 查看
请求头
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400"}
为get()方法加入请求头
res=requests.get("http://bj.xiaozhu.com/",headers=headers)
post()方法用于提交表单来爬取需要登录才能获得数据的网站
BeautifulSoup库:轻松的解析Requests库请求的网页,并把网页源码解析为Soup文档,以便过滤提取数据
import requests
from bs4 import BeautifulSoup
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400"}
res=requests.get("http://bj.xiaozhu.com/",headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
print(soup.prettify())
BeautifulSoup库主要解析器的优缺点
Soup文档可以使用find() find_all() selector()定位需要的元素
例子
import requests
from bs4 import BeautifulSoup
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400"}
res=requests.get("http://bj.xiaozhu.com/",headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
try:
price=soup.select("#page_list > ul > li > div.result_btm_con.lodgeunitname > div > span > i")
#print(res)
#print(res.text)
#print(soup.prettify())
print(price)
except ConnectionError:
print("拒绝连接")
其中li:nth-child(1)在Python运行时会报错需要改为 li:nth-of-type(1).
也可以使用 get_text()方法获取中间的文字消息。
欢迎进群交流