目录
一、简介
Python 中基于网络请求的模块:urllib、requests模块,目前 requests 基本代替了 urllib,因为 requests 更加简洁高效。
requests 是 Python中原生的一款基于网络请求的模块,功能强大,归根到底,requests 模块的作用就是模仿浏览器发请求
二、使用方法(爬虫的流程)
模拟浏览器发请求的流程如下:
1.指定url
2.发起请求
3.获取响应数据
4.持久化存储
三、实例
(一)爬取搜狗首页的页面数据:
1.指定 url
import requests
url='https://www.sogou.com/'
2.发起请求:requests 可以发起 get 与 post 请求
get() 方法会返回一个响应对象,用 response 接收
response=requests.get(url=url)
3.获取响应数据
获取的是页面的 HTML 源码数据,text 返回的是字符串形式的响应数据
page_text = response.text
print(page_text)
4.持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
存在当前目录下,会生成一个.html文件
打开后就是该网页的HTML源码了
(二)豆瓣电影喜剧前20排行
1.分析
打开豆瓣电影的网站,选择排行榜,定位到喜剧类型
浏览过程中发现,拖动鼠标滚轮到底部的时候页面会进行局部刷新,说明在滚轮拖动至底部时页面会发起 Ajax 异步请求
打开抓包工具定位 Network 中的 XHR选项卡当中,拖动滚轮,到底部后新增了一个请求
查看一下新发出的请求信息和参数
可知:该 URL 发起的为 get 请求,返回数据类型为 json 类型,有五个参数。因此,只要对该URL发起一个 get 请求并令其携带五个参数即可得到一组 json 类型的响应数据
2.爬取
(1)导包,指定URL
import requests
import json
url='https://movie.douban.com/j/chart/top_list?type=24&interval_id=100:90&action=&start=20&limit=20'
(2)参数处理
但凡参数,封装到字典里比较好处理(?后面的就是该网页的参数)将网页参数复制过来
param = {'type': '24',
'interval_id': '100:90',
'action': '',
'start': '20',
'limit': '20'}
参数的意思:start:从库中的第几部电影取;limit:一次取几部电影。这些参数可以动态修改
(3)UA伪装,获取响应数据
head={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}
response=requests.get(url,params=param,headers=head)
list_obj=response.json()
该返回结果是一个列表类型的对象,因此使用 list_obj 接收
(4)储存数据
with open('./douban.json','w',encoding='utf-8') as fp:
json.dump(list_obj,fp,ensure_ascii=False)
print('over')
代码已经完成,运行成功,通过更改 “start” 与 “limit” 参数可以获取排行榜单上某段排名的电影数据。如排行榜前20部,第一部是美丽人生(从0开始)
期间一个粗心的错误:未删除URL的?后面的参数导致报错
3.代码
import requests
import json
url = 'https://movie.douban.com/j/chart/top_list?'
param = {'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'}
head={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}
response=requests.get(url,params=param,headers=head)
list_obj=response.json()
with open('./douban.json','w',encoding='utf-8') as fp:
json.dump(list_obj,fp,ensure_ascii=False)
# fp = open('./douban.json', 'w', encoding='utf-8')
# json.dump(list_obj, fp, ensure_ascii=False)
print('over')