爬虫-爬取网页数据
通过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)