文章目录
request模块:模拟浏览器请求
如何使用request模块(request模块的编码流程):
- 指定url
- 发起请求
- 获取响应数据(源码)
- 持久化存储
实战:
爬取搜狗首页的页面数据
- UA检测
- UA伪装
-
简易网页搜索器
代码
import requests
#UA检测:User-Agent(请求载体的身份标识),
# 门户网站的服务器会检测对应请求的载体身份标识,
# 如果检测到请求的载体身份标识为某一款浏览器,那么说明该请求是个正常请求
# 但是如果检测到请求的载体身份标识不是基于某一款浏览器的
# 则表示该请求为不正常的请求(是基于爬虫载体的请求),服务器端会拒绝该次请求
#UA检测的反扒策略是UA伪装,让爬虫对应的请求载体身份标识伪装成某一款浏览器
if __name__ == "__main__":
#UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent' :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
#1.指定url
url = 'https://www.baidu.com/s'
#2.处理url携带的参数:封装到字典中
kw = input('enter a word:')
param = {
'wd':kw
}
#2.发起get请求
#对指定的url发起的请求对应的url时携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,params=param,headers=headers)
page_text = response.text
fileName = kw + '.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName,'保存成功!!!!')
结果
破解百度翻译
- post请求(携带了参数)
- 响应数据是一组json数据串
ajax进行页面局部刷新,页面自动进行刷新,XHR对应ajax请求的数据包
找post请求的参数,参数是dog,说明是ajax请求的数据包
第一个post请求的数据包
响应数据
代码:
import json
import requests
if __name__ == '__main__':
#1.从ajax数据包中找post方法的url
post_url = 'https://fanyi.baidu.com/sug'
#2.进行UA伪装
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
#3.post请求参数处理(同get请求一致)
word = input('enter a word')
data = {
'kw':word
}
#4.请求发送
response = requests.post(url=post_url,data=data,headers=headers)
#5.获取响应数据:json()方法返回的是obj,我们要转化成字典类型的(如果确认响应数据是json类型的,才可以使用json(),如何确认?查看response headers的content-type是不是application/json)
dic_obj = response.json()
print(dic_obj)
#持久化存储
fileName = word + '.json'
fp = open(fileName,'w',encoding='utf-8')
#将字典对象转化为json数据,存到文件fp里
json.dump(dic_obj,fp=fp,ensure_ascii=False)
print('over!!!')
结果:
爬取豆瓣电影
爬取豆瓣喜剧电影排行榜名称,导演,上映时间
当滚轮向下划到底,页面自动加载刷新,这是一个ajax动态请求
观察响应数据response,里边的内容正是我们请求到的新一批的电影详情数据
代码:
动态地处理start和limit这两个数据可以获取不同的响应数据
import requests
import json
if __name__ == '__main__':
url='https://movie.douban.com/j/chart/top_list'
param = {
'type': '24',
'interval_id': '100:90',
'action':'',
'start': '0', #从库中的第20部电影开始爬取
'limit': '20' #一次请求取出的个数
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
response = requests.get(url=url,params=param,headers=headers)
list_data = response.json()
fp = open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
print(