爬取豆瓣电影数据
注意:运行代码,可能会被IP封禁。
通过百度AI(文心一言)询问的豆瓣封禁IP规则是:
白天不能超过40
次
晚上不能超过60
次
遵守法律,不要影响网站正常运行!!!
简介
本人刚开始接触爬虫,写的第一个程序,代码不是很完善,可能有点臃肿。可以拷贝下来自行修改。
- 分析结构和请求
昨晚在尝试解析https://movie.douban.com
页面信息的时候看了一下请求。发现有一个请求返回的结果就是电影的基本信息。
- 解析内容
通过获取下来的json格式的内容,拿到了电影名、电影简介地址、电影图片地址信息。
代码
运行前需要检查是否安装了requests
和parsel
库
import requests
from parsel import Selector
import json
# 请求的电影信息
base_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/122.0.0.0 Safari/537.36'
}
保存信息
def save_img(filename, movie_img):
"""
保存电影图片信息
:param filename: 文件名
:param movie_img: 图片路径
:return: None
"""
# 请求出图片用content的获取二进制
content_bytes = requests.get(movie_img).content
with open(filename, 'wb') as file:
# 通过二进制保存
file.write(content_bytes)
调整参数
更换URL中的tag
和page_limit
信息可以调整获取的内容
完整代码
import requests
from parsel import Selector
import json
# 请求的电影信息
base_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/122.0.0.0 Safari/537.36'
}
def return_content(url):
"""
此函数可能多余了!!
:param url: 请求的地址
:return:
"""
response = requests.get(url, headers=headers)
return response.text
def inner_link(text):
movies = json.loads(text)['subjects']
for movie in movies:
title = movie['title'] # 获取标题
movie_url = movie['url'] # 获取电影链接
movie_img = movie['cover'] # 获取电影图片
# movie_rate = movie['rate'] # 获取电影评分
print(f'获取电影《{title}》...')
print(f'电影简介地址: {movie_url}')
current_text = return_content(movie_url)
get_movie_info(current_text)
print(f'开始保存《{title}》图片...')
save_img(title + '.jpg', movie_img)
print(f'保存成功!!《{title}》')
print('=' * 150)
def save_img(filename, movie_img):
"""
保存电影图片信息
:param filename: 文件名
:param movie_img: 图片路径
:return: None
"""
# 请求出图片用content的获取二进制
content_bytes = requests.get(movie_img).content
with open(filename, 'wb') as file:
# 通过二进制保存
file.write(content_bytes)
def get_movie_info(text):
"""
抓取信息
:param text: 获取当前URL的文本内容
:return:
"""
selector = Selector(text=text)
item = selector.css('#info')
with open('movies.txt', 'a') as file:
file.write('\n')
direct = item.css('span:nth-child(1)').xpath('//span[contains(@class,"attrs")]//text()').get() # 导演
file.write('导演: ' + direct)
file.write('\n')
writer = item.css('span:nth-child(2) > a::text').get() # 编剧
file.write('编剧: ' + writer)
file.write('\n')
actors = item.css('span.actor a::text').getall()[:5] # 主演
file.write('主演: ')
for actor in actors:
file.write(actor + ' / ')
file.write('\n')
types = item.xpath('//span[contains(@property, "v:genre")]/text()').getall()
file.write('类型:')
for _ in types:
file.write(_ + ' / ')
file.write('\n')
infos = selector.xpath('//div[contains(@class, "indent") and contains(@id, "link-report-intra")]/span/text()').getall()
file.write('简介:\n')
for info in infos:
file.write(info.strip() + '\n')
file.write('\n' + ('=' * 50))
if __name__ == '__main__':
content = return_content(base_url)
inner_link(content)