通过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)