爬虫-爬取网页数据
通过Python3.8 来写爬虫代码,获取网站信息
爬虫库:requests 一般用于处理网络请求,获取html页面
requests库的session会话对象可以跨请求保持某些参数。说白了,就是使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数
在爬取页面的时候不能每一次请求就去登陆一下,这时需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求
# 请求参数
payload = {'key1': 'value1', 'key2': 'value2'}
# 添加请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45'
}
# requests的会话对象
sess = requests.session()
# get请求
r = requests.get("http://httpbin.org/get",params=payload, headers=headers)
# post请求
r = requests.post("http://httpbin.org/post", data=payload, headers=headers)
# put请求
r = requests.put("http://httpbin.org/put")
# delete请求
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")
Beautifulsoup库 处理整个页面的html代码,从HTML或XML文件中提取数据
Beautifulsoup中文文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id14
# 选用lxml解析器来解析
soup = BeautifulSoup(html, 'lxml')
# 获取标题
print(soup.title)
# 获取文本
print(soup.title.text)
# 通过标签定位 输出数组
print(soup.find_all('a'))
# 通过属性定位 输出数组
print(soup.find_all(attrs={'id': 'link1'}))
# 标签 + 属性定位 输出数组
print(soup.find_all('a', id='link1'))
# 输出文本
print(soup.text)
案例:爬取博客园首页文章信息
import requests
from bs4 import BeautifulSoup
# 添加请求头
headerss = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45'
}
# 博客园的首页信息
back1 = requests.get('https://www.cnblogs.com/', headers=headerss)
# 通过Beautiful 获取html文本中的内容
def query_info(back):
soup = BeautifulSoup(back.text)
# 调整html文本格式
# print(soup.prettify())
# 在文档中找到以div为标签的数据
# print(soup.find_all('div'))
# 通过div标签及属性进行寻找 返回一个数组 第一次寻找
list = soup.find_all('div', {'class': 'post-item-text'})
print('**********************************************************')
for query in list:
# 通过属性进行第二次寻找
query_title = query.find_all(attrs={'class': 'post-item-title'})
query_text = query.find_all('p')
print("--------------------")
# 输出文本
print("标题:" + query_title[0].text.replace('\n', ''))
print("摘要:" + query_text[0].text.replace(' ', '').replace('\n', ''))
print("--------------------")
print('**********************************************************')
query_info(back1)
# 读取博客园的下一页操作
# 请求头
header2 = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
'referer': 'https://www.cnblogs.com/'
}
# 输入参数
data1 = {
"CategoryId": 808,
"CategoryType": "SiteHome",
"ItemListActionName": "AggSitePostList",
"PageIndex": 2,
"ParentCategoryId": 0,
"TotalPostCount": 4000
}
# 建立一个会话
sess = requests.session()
# 访问首页,通过会话拿取cookie
sess.get('https://www.cnblogs.com/', headers=header2)
back2 = sess.post('https://www.cnblogs.com/AggSite/AggSitePostList', json=data1, headers=header2)
query_info(back2)

浙公网安备 33010602011771号