-
爬虫中一个基于网络请求的模块 pip install requests
-
作用:模拟浏览器发起请求。
-
编码流程:
- 1.指定url
- 2.发起请求
- 3.获取相应数据
- 持久化存储
-
爬取搜狗首页的页面源码数据
1 2 3 4 5 6 7 8 9 10
import requests #1,指定url url = 'https://www.sogou.com/' #2,发起请求 get方法的返回值为响应对象 response = requests.get(url=url) #3,获取响应数据 #.text:返回的是字符串形式的响应数据 page_text = response.text #4,持久化存储 with open('./sougou.html', 'w', encoding='utf-8') as fp : fp.write(page_text)
-
实现一个简易网页采集器
-
基于搜狗针对指定不同的关键字将其对应的页面数据进行爬取
-
参数动态化:
-
如果请求的url携带参数,且我们想要将携带的参数进行动态化操作那么我们必须:
-
将携带的动态参数以键值对的形式封装到一个字典中
-
将该字典作用到get方法的params参数中即可
-
需要将原始携带参数的url中将携带的参数删除
-
-
1 2 3 4 5 6 7 8 9 10 11 12 13
keyWord = input('输入关键字:') #携带了请求参数的url,如果想要爬取不同关键字对应的页面,我们需要将url携带的参数进行动态化 #实现参数动态化: params = { 'query': keyWord } url = 'https://www.sogou.com/web' #params参数(字典):抱球请求时url携带的参数 response = requests.get(url=url, params=params) page_text = response.text fileName = keyWord+'.html' with open(fileName, 'w', encoding='utf-8') as fp: fp.write(page_text) print(fileName, '爬取完毕!')
-
上述简易采集器出现的问题:
- 乱码
- 数据丢失
-
解决乱码:
-
修改响应数据的编码格式
-
encoding返回的是相应数据的原始的编码格式,如果给其赋值则表示修改了相应数据的编码格式
在第9行后插入
response.encoding = 'utf-8'
-
-
处理乱码后,页面显示[异常访问请求]导致数据丢失。
- 异常的访问请求
- 网站后台检测出异常。
- 网站的后台是如何知道请求是否是通过浏览器发起的?
- 通关判定请求头中的user-agent
- 异常的访问请求
-
什么是user-agent
- 请求载体(爬虫,浏览器)的身份标识。浏览器的身份标识是统一固定的,身份标识可以从抓包工具中获取。爬虫程序的身份标识是各自不同的。
-
-
第二种反爬机制:
- UA检测:网站后台会检测请求对应的user-agent,以判定当前请求是否为异常请求
-
反反爬策略:
- UA伪装:被作用到了大部分网站中
- 伪装流程:
- 从抓包工具中捕获到某一个基于浏览器请求的user-agent的值,将其伪装作用到一个字典中,将该字典作用到请求方法(get,post)的headers参数中即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
keyWord = input('输入关键字:') headers = { 'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0' } #携带了请求参数的url,如果想要爬取不同关键字对应的页面,我们需要将url携带的参数进行动态化 #实现参数动态化: params = { 'query': keyWord } url = 'https://www.sogou.com/web' #params参数(字典):抱球请求时url携带的参数 response = requests.get(url=url, params=params,headers=headers) #修改响应数据的编码格式 #encoding返回的是相应数据的原始的编码格式,如果给其赋值则表示修改了相应数据的编码格式 response.encoding = 'utf-8' page_text = response.text fileName = keyWord+'.html' with open(fileName, 'w', encoding='utf-8') as fp: fp.write(page_text) print(fileName, '爬取完毕!')
-
爬取豆瓣电影中的电影详情数据
-
url:https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=
-
动态加载数据的捕获
- 什么叫做动态加载的数据? 我们通过requests模块进行数据爬取无法每次都实现可见即可得。因为有些数据是通过非浏览器地址栏中的url请求到的数据,而是其他请求请求到的数据,那么这些通过其他请求请求到的数据就是动态加载的数据。
-
如何检测网页中是否存在动态加载数据。
- 基于抓包工具进行局部搜索。 在当前网页中打开抓包工具,捕获到地址栏的url对应的数据包,在该数据包的response选项卡搜索我们想要爬取的数据,如果搜索到了结果则表示数据不是动态加载的我,否则表示数据为动态加载的。
-