c 抓取网页数据([]请求载体的身份识别信息)
优采云 发布时间: 2022-02-15 01:12c 抓取网页数据([]请求载体的身份识别信息)
要查找更改的参数,只需下拉进度条即可查看新的请求数据
可以看出只有start变了,start 80;限制 20;开始100;限制20。能猜到这20是每次刷新的视频数吗?start 是从第一个视频开始阅读?
通过对网页的初步分析,这种可能性非常高,而且很容易验证。记住里面的请求是GET,所以可以用浏览器直接访问接口进行验证。
start=1 limit=2,刷新了本杀手不太冷和七武士的两部电影
start=2 limit=3,刷新了《七武士》、《割肚皮》、《蝙蝠侠:黑暗骑士》三部影片。由此可以验证 start 是视频排名第一的请求。限制是每个请求的视频数量。如果我想抓取前 300 个视频,我只需要 start=1,limit=300。网页分析到这里就可以完成了,我们想要的信息已经得到了。
1、接口:%3A90&action=&start=2&limit=3
2、请求方法:GET
3、参数:type interval_id action start limit 前三个是固定的
概括:
1、这部分通过对网页的分析发现,豆瓣视频的排名采用了网页的部分动态加载技术
2、检查中筛选出动态加载的请求接口,请求反馈为类json格式(供后期python解析),通过猜测发现start和limit两个参数的含义直接调用接口
python代码编写
1、User_agent介绍
如果你是豆瓣网站的开发者,你希望别人用不正规的方法批量抓取你的网站中的数据吗?想一想,答案肯定是否定的。那么网站服务器如何判断当前访问是否合法呢?最基本的方式是使用请求载体的身份信息User_agent。不同的浏览器有不同的身份信息。
以下是作者谷歌浏览器的识别信息。那么,为了防止写入的程序请求被服务器拒绝访问,在向请求模块请求时必须带上标识信息。
2、代码
先直接上代码,和excel数据
```python
#!/user/bin/env python
# -*- coding:utf-8 -*-
#UA:User-Agent(请求载体的身份标识)
#UA检测,网站检测到UA不是正常浏览器身份标识,则服务器端很有可能会拒绝该请求
#UA伪装,让爬虫对应的请求载体UA标识伪装成某一浏览器
#解析豆瓣电影
#页面局部刷新 XHR请求
import requests
import json
import xlwings as xw
# 指定url,发起请求,获取响应数据,存储
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/90.0.4430.93 Safari/537.36'
}
url= "https://movie.douban.com/j/chart/top_list"
start_num = input("enter start num:")
limit_num = input("enter limit num:")
param = {
'type': '5',
'interval_id': '100:90',
'action':'',
'start': start_num,
'limit': limit_num,
}
#处理url携带的参数:封装到字典中
response = requests.get(url=url, params=param,headers = headers)
# print(response.text)
# ps_name = json.loads(response.text).get('ps_name')
# print('\r\n',ps_name)
#确认服务器返回的json则可以使用json
dic_obj = response.json()
# json_name = json.loads(dic_obj)
app=xw.App(visible=False,add_book=False)
wb=app.books.add()
sht = wb.sheets['Sheet1']
sht.range('A1').value ='序号'
sht.range('B1').value ='排名'
sht.range('C1').value ='名称'
sht.range('D1').value ='评分'
sht.range('E1').value ='上映日期'
sht.range('F1').value ='国家'
i=1
for dic_item in dic_obj:
print('cnt:',i,'title ',dic_item['title'],'\r\n')
sht.range('A'+str(i+1)).value =i
sht.range('B'+str(i+1)).value = dic_item['rank']
sht.range('C'+str(i+1)).value = dic_item['title']
sht.range('D'+str(i+1)).value = dic_item['rating'][0]
sht.range('E'+str(i+1)).value = dic_item['release_date']
sht.range('F'+str(i+1)).value = dic_item['regions'][0]
i +=1
wb.save('movie_rank.xlsx')
wb.close()
app.quit()
执行一下,程序已经在正确输出信息了
打开生成的excel,需要的信息已经生成,剩下的分析就看你的excel能力了
如果改进程序,分析页面后发现type是对应的电影类型,5:动作;11:情节。您可以尝试所有类型并将它们放入字典中以指定要捕获的特定类型的电影。作者完成的是动作片的捕捉。
代码分析
使用的模块
requests
json
xlwings
requests是网络请求的库,xlwings是操作excel的库,支持xlxs格式文件。
#UA:将对应的User_Agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
url= "https://movie.douban.com/j/chart/top_list"
start_num = input("enter start num:")
limit_num = input("enter limit num:")
param = {
'type': '5',
'interval_id': '100:90',
'action':'',
'start': start_num,
'limit': limit_num,
}
这部分是定义头、访问接口和参数,改变的参数是从终端输入的。
#处理url携带的参数:封装到字典中
response = requests.get(url=url, params=param,headers = headers)
使用get命令访问,部分网页可能使用post,需要与网页的实际请求方式一致。浏览器地址栏只能实现get请求,post请求可以用postman等工具验证
dic_obj = response.json()
# json_name = json.loads(dic_obj)
app=xw.App(visible=False,add_book=False)
wb=app.books.add()
sht = wb.sheets['Sheet1']
sht.range('A1').value ='序号'
sht.range('B1').value ='排名'
sht.range('C1').value ='名称'
sht.range('D1').value ='评分'
sht.range('E1').value ='上映日期'
sht.range('F1').value ='国家'
i=1
for dic_item in dic_obj:
print('cnt:',i,'title ',dic_item['title'],'\r\n')
sht.range('A'+str(i+1)).value =i
sht.range('B'+str(i+1)).value = dic_item['rank']
sht.range('C'+str(i+1)).value = dic_item['title']
sht.range('D'+str(i+1)).value = dic_item['rating'][0]
sht.range('E'+str(i+1)).value = dic_item['release_date']
sht.range('F'+str(i+1)).value = dic_item['regions'][0]
i +=1
wb.save('movie_rank.xlsx')
wb.close()
app.quit()
这部分实现读取返回的json格式数据,转换后的数据其实是一个字典。
操作excel 5步
1、构建APP
2、创建书籍
3、创建工作表页面
4、数据写入
5、保存关闭
sht.range('A1').value='序列号'
这意味着将序列号写入A1单元。如果需要写到B10,把上面的A1改成B10,操作起来很方便。