爬取过程虽然简单,但以学习为目的,在中间使用了一些库以及python语法的高级用法。
打开https://movie.douban.com/top250? 网址,翻到最下面,打开开发者工具,随便点击翻页。会看到下图请求的URL,URL里只有start变化,每次翻页加25,到250截至。
全篇提取信息全用正则表达式。
获取详情页
def get_detail_url(base_url):
"""
:param base_url: 初始网页
:return: 每页电影url的列表
"""
html = requests.get(url=base_url, headers=headers).text
url = re.findall('', html)
return url
因为这次写入csv文件,返回数据时以列表形式
def get_film_info(film_url):
"""
:param film_url: 每个电影的url
:return: 电影信息的列表
"""
html = requests.get(url=film_url, headers=headers).text
mark = re.search('"ratingValue": "(.*?)"', html).group(1) # 评分
name = re.search('e="title" value="(.*?)">', html).group(1) # 电影名
total_mark = re.search(r'(\d+)', html).group(1) # 评论人数
picture_url = re.search('"image": "(.*?)",', html).group(1) # 电影海报图片地址
# 经测试,电影的简介共有两种情况,用正则提取需要判断
try:
summary = re.search('(.*?)', html, re.S).group(1).strip()
except AttributeError:
summary = re.search(' ', html, re.S).group(1).strip()
summary = re.sub(r'\s', '', summary).replace('
', '') # 去掉所有空白字符,然后替换掉
# 这里返回列表,防止电影信息中存在英文状态下的逗号
return [name, mark, total_mark, picture_url, summary]
写入时newline一定要设置为空,否则插入数据时每条数据之间都会有空行。
def write_to_csv(content):
"""
:param content: 电影信息 列表
:return: None
"""
with open('豆瓣TOP250.csv', 'a', encoding='utf8', newline='') as f:
print('正在写入....')
csv_writer = csv.writer(f)
csv_writer.writerow(content)
完整代码
import re, requests, csv
def get_detail_url(base_url):
"""
:param base_url: 初始网页
:return: 每页电影url的列表
"""
html = requests.get(url=base_url, headers=headers).text
url = re.findall('', html)
return url
def get_film_info(film_url):
"""
:param film_url: 每个电影的url
:return: 电影信息的列表
"""
html = requests.get(url=film_url, headers=headers).text
mark = re.search('"ratingValue": "(.*?)"', html).group(1) # 评分
name = re.search('e="title" value="(.*?)">', html).group(1) # 电影名
total_mark = re.search(r'(\d+)', html).group(1) # 评论人数
picture_url = re.search('"image": "(.*?)",', html).group(1) # 电影海报图片地址
# 经测试,电影的简介共有两种情况,用正则提取需要判断
try:
summary = re.search('(.*?)', html, re.S).group(1).strip()
except AttributeError:
summary = re.search(' ', html, re.S).group(1).strip()
summary = re.sub(r'\s', '', summary).replace('
', '') # 去掉所有空白字符,然后替换掉
# 这里返回列表,防止电影信息中存在英文状态下的逗号
return [name, mark, total_mark, picture_url, summary]
def write_to_csv(content: list):
"""
:param content: 电影信息 列表
:return: None
"""
with open('豆瓣TOP250.csv', 'a', encoding='utf8', newline='') as f:
print('正在写入....')
csv_writer = csv.writer(f)
csv_writer.writerow(content)
if __name__ == '__main__':
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', }
for page in range(0, 251, 25): # 循环所有检索页
tp_url = 'https://movie.douban.com/top250?start={}&filter='.format(page)
film_info = [get_film_info(fu) for fu in get_detail_url(tp_url)]
[write_to_csv(info) for info in film_info]