
利用python的三种不同方式爬取《豆瓣电影TOP250》排行榜的所有电影信息
这段代码使用了lxml库的etree模块来解析HTML文档,通过XPath选择器提取所需数据。请注意,Ch模块包含了处理网络请求和文件路径的自定义功能,它包含get_web_request()方法用于发送网络请求,并且get_dir_cache_to()方法用于返回缓存目录路径。这段代码主要用于爬取豆瓣电影Top250列表中的电影详细信息,并将其存储到CSV文件中。它使用了BeautifulSou
·
一、利用《BeautifulSoup》方法,爬取《豆瓣电影》排行榜
以下代码是一个用于从豆瓣电影Top250页面抓取数据的Python脚本,使用了
csv
模块来写入CSV文件以及BeautifulSoup
进行HTML解析。下面是带有注释的代码,解释了每个部分的功能。
# 导入必要的模块
import csv
from bs4 import BeautifulSoup
import Ch # 自定义模块,提供网络请求和缓存目录获取功能
# 主函数,接受一个URL作为参数
def main(url):
# 使用Ch模块的get_web_request方法获取网页的HTML内容
html = Ch.get_web_request(url)
# 创建BeautifulSoup对象,用于解析HTML
soup = BeautifulSoup(html, 'html.parser')
# 获取页面上的每个.item元素(代表每部电影)
for element in soup.select('.item'):
# 获取排行榜的序号
num = element.select_one('em').text
# 获取电影名称
zw_name = element.select_one('span.title').text
# 获取电影详情链接
urls = element.select_one('div.hd a')['href']
# 获取评分
star_rating = element.select('div.star span')[1].text
# 获取评价人数,去除“人评价”文本
star_num = element.select('div.star span')[3].text.replace('人评价', '')
# 获取剧情评语,如果不存在则为空字符串
content = element.select_one('p span.inq').text if element.select_one('p span.inq') is not None else ''
# 将抓取的数据打包成元组
tuples = (num, zw_name, urls, star_rating, star_num, content)
# 将元组写入CSV文件
csv_writer.writerow(tuples)
# 打印当前处理的元组信息
print(tuples)
# 如果直接运行此脚本,则执行以下代码
if __name__ == '__main__':
# 打开CSV文件,写模式,UTF-8编码,去除空行
with open(Ch.get_dir_cache_to('test.csv'), mode='w', encoding='utf-8', newline='') as f:
# 创建CSV写入器
csv_writer = csv.writer(f)
# 写入表头
csv_writer.writerow(['序号', '电影名称', '电影详情链接', '评分', '评价人数', '剧情概况'])
# 循环抓取前10页的数据
for i in range(10):
# 调用main函数,传入当前页的URL
main(f'https://movie.douban.com/top250?start={i * 25}&filter=')
# 打印完成提示
print(f'第{i + 1}页爬取完毕.')
二、利用《XPath》方法,爬取《豆瓣电影》排行榜
这段代码使用了lxml库的etree模块来解析HTML文档,通过XPath选择器提取所需数据。同时,使用正则表达式来匹配和提取某些特定格式的信息。最后,将抓取到的信息保存到CSV文件中。
# 导入必要的模块
import csv
import re
from lxml import etree
import Ch # 自定义的模块,提供网络请求和一些辅助功能
# 主函数,负责爬取豆瓣Top250电影的详细信息
def main(url):
# 发送GET请求并获取HTML页面内容
html = Ch.get_web_get(url).text
# 解析HTML文档
tree = etree.HTML(html)
# 获取电影详情页的链接列表
href_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href')
# 获取电影名称列表
name_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
# 遍历电影详情页链接和名称列表
for href_, name_ in zip(href_list, name_list):
# 设置请求头中的Host字段
Ch.params_headers['host'] = 'movie.douban.com'
# 请求电影详情页
html_ = Ch.get_web_get(href_).text
# 解析详情页HTML文档
tree_ = etree.HTML(html_)
# 获取导演信息
dir_ = tree_.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
# 使用正则表达式提取电影类型
type_ = re.findall(r'property="v:genre">(.*?)</span>', html_)
# 将类型列表转换为字符串,各类型之间用斜杠分隔
type_ = '/'.join(type_)
# 使用正则表达式提取制片国家
country_ = re.findall(r'地区:</span> (.*?)<br', html_)[0]
# 获取上映日期(提取年份)
time_ = tree_.xpath('//*[@id="content"]/h1/span[2]/text()')[0][1:5]
# 获取评分
rate_ = tree_.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
# 获取评价人数
people_ = tree_.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/div/div[2]/a/span/text()')[0]
# 将抓取到的信息封装为元组
tuples = (name_, dir_, type_, country_, time_, rate_, people_)
# 将元组写入CSV文件
csv_writer.writerow(tuples)
# 打印当前处理的元组信息
print(tuples)
# 当该脚本被直接运行时执行以下代码
if __name__ == '__main__':
# 打开CSV文件,写模式,UTF-8编码,无空白行
with open(Ch.get_dir_cache_to('test.csv'), mode='w', encoding='utf-8', newline='') as f:
# 创建CSV写入器
csv_writer = csv.writer(f)
# 写入CSV文件的表头
csv_writer.writerow(['电影名称', '导演', '类型', '制片国家', '上映日期', '评分', '评价人数'])
# 遍历前10页的豆瓣Top250电影列表
for i in range(10):
# 调用main函数,传入当前页的URL
main(f'https://movie.douban.com/top250?start={i * 25}&filter=')
# 打印当前页的爬取状态
print(f'第{i + 1}页爬取完毕.')
三、利用《正则表达式》方法,爬取《豆瓣电影》排行榜
这段代码主要用于爬取豆瓣电影Top250列表中的电影详细信息,并将其存储到CSV文件中。它使用了BeautifulSoup和正则表达式来解析和提取网页中的数据。
# 导入必要的模块
import csv
import re
from bs4 import BeautifulSoup
import Ch # 假设Ch模块提供了一些自定义功能,如网络请求和文件路径获取
# 定义主函数,负责爬取指定URL的网页数据
def main(url):
# 使用Ch模块的get_web_request方法发送网络请求并获取响应内容
html = Ch.get_web_request(url)
# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(html, 'html.parser')
# 查找所有class为'item'的div标签,即每一部电影的条目
for item in soup.find_all('div', class_='item'):
# 使用正则表达式提取电影详情链接
info_01 = re.findall(re.compile(r'<a href="(.*?)">'), str(item))[0]
# 提取电影封面图片链接
info_02 = re.findall(re.compile(r'<img.*src="(.*?)"', re.S), str(item))[0]
# 提取电影标题(中文名和英文名),可能有两个标题
title = re.findall(re.compile(r'<span class="title">(.*)</span>'), str(item))
# 根据标题数量,设置中文名和外文名
if len(title) == 2:
info_03 = title[0] # 中文名
info_04 = title[1].replace('/', '') # 英文名,去除斜杠
else:
info_03 = title[0] # 中文名
info_04 = ' ' # 如果只有一个标题,英文名留空
# 提取评分
info_05 = re.findall(re.compile(r'<span class="rating_num" property="v:average">(.*)</span>'), str(item))[0]
# 提取评价人数
info_06 = re.findall(re.compile(r'<span>(\d*)人评价</span>'), str(item))[0]
# 提取剧情概况,可能不存在
inq = re.findall(re.compile(r'<span class="inq">(.*)</span>'), str(item))
if len(inq) == 0:
info_07 = ' ' # 如果没有概况,留空
else:
info_07 = inq[0].replace('。', '') # 去除句点
# 提取更多信息,如导演、演员等,可能存在换行和斜杠
bd = re.findall(re.compile(r'<p class="">(.*?)</p>', re.S), str(item))[0]
# 清理换行符和多余空格
bd = re.sub('<br(\s+)?/>(\s+)?', '', bd)
bd = re.sub('/', '', bd)
info_08 = bd.strip() # 去除首尾空格
# 将提取的信息打包成元组
tuples = (info_01, info_02, info_03, info_04, info_05, info_06, info_07, info_08)
# 将元组写入CSV文件
csv_writer.writerow(tuples)
# 打印当前处理的元组信息
print(tuples)
# 如果直接运行这个脚本
if __name__ == '__main__':
# 打开CSV文件,写模式,UTF-8编码,无空行
with open(Ch.get_dir_cache_to('test.csv'), mode='w', encoding='utf-8', newline='') as f:
# 创建CSV写入器
csv_writer = csv.writer(f)
# 写入表头
csv_writer.writerow(['电影详情链接', '图片链接', '影片中文名', '影片外国名', '评分', '评价人数', '剧情概况', '相关信息'])
# 循环爬取10页数据
for i in range(10):
# 调用main函数,传入当前页的URL
main(f'https://movie.douban.com/top250?start={i * 25}&filter=')
# 打印完成提示
print(f'第{i + 1}页爬取完毕.')
请注意,Ch模块包含了处理网络请求和文件路径的自定义功能,它包含get_web_request()方法用于发送网络请求,并且get_dir_cache_to()方法用于返回缓存目录路径。
我是一名python初学者,正探索美妙旅程的起点,希望高手指教,与友互进!
-
该文章仅供学习交流使用,不得用于商业目的或非法传播。若有侵权请联系作者进行删除。
更多推荐
所有评论(0)