requests模块巩固
我们继续进一步的巩固和学习requests
案例3:
需求:爬取豆瓣电影分类排行榜喜剧的详细数据
import requests
import json
#1.指定 url
url = 'https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=20&limit=20'
# 将上述?后携带的参数的数据进行封装 因为使用get 方法,所以用params
url = 'https://movie.douban.com/j/chart/top_list?'
param = {
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0', #表示从库中的第几部开始取
'limit': '20' #表示一次取出的个数
}
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
#获取响应数据
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("Over!")
运行后,则爬取到了一个json文件。
我们将其复制下来,找一个json在线解析的网站,复制进去,可以发现我们得到的结果。
不过,这是没有经过处理的数据。所以还是比较乱的。
我们来写一个进行处理的,仅爬取豆瓣排行榜前250的电影,并保存下来。
可知,电影是要翻页的,每一页只有25个电影,一共10页。我们观察每个页面对应的url有何区别:
第二页
第三页
所以易知需要通过改变 start= 对应的数据(0、25、50、75....225)来进行翻页。我们可以使用循环来进行翻页爬取,保存。因为我们仅需要爬取电影的名称,所以我们要在页面中查找电影名对应的位置:
我们需要对爬取页面信息要进行处理,所以我们需要bs4的包,和之前一样下载。然后使用bs4的
BeautifulSoup进行解析html的内容。电影的名字在'span',"class": "title"的位置。所以代码如下:
import requests
from bs4 import BeautifulSoup
#定制请求头
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0"
}
#建立文件 你可以把路径改成你自己的
f = open("D:/Python学习/爬虫/douban.txt","w",encoding="UTF-8")
#因为豆瓣top250是分为页面的 每个页面只有部分电影,使用循环
for start_num in range(0,250,25):
response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)
html = response.text
soup = BeautifulSoup(html, "html.parser") # 解析html内容
"""分析你所要提取信息的特点"""
all_titles = soup.find_all("span", attrs={"class": "title"})
for title in all_titles:
title_string = title.string
if "/" not in title_string:
f.write(f"{title_string}/n")
print(title_string)
结果如上。