您的位置:首页 > 编程语言 > Python开发

python爬虫 豆瓣电影top250

2019-03-06 16:13 986 查看

原始网页

找到请求地址,发起请求

查看网页源码,定位需要爬取的内容标签

根据标签提取内容

提取结果

多获取一些数据
提取排名、外文名和别名

提取结果

再爬取一个详细页的链接

打印一下

再进入到电影的详情页面中去爬取电影介绍

先找到源码标签位置

另外定义一个函数来爬取详情页面
请求刚刚在列表页爬取的电影详情页的链接
用xpath提取出简介部分
提取出来会有特殊符号和大段空格
使用html.escape 把html里的特殊符号解析出来,再用strip去除空格

在刚刚的for循环里调用这个函数,传入链接

打印数据:

现在只获取了第一页数据,把当前写的代码封装成函数,继续爬取剩余页面
根据观察,每页的url地址是有规律的,总共10页,直接生成url列表

全部实现后打印效果
总共250条数据

增加评分爬取


以下是完整代码:
开发工具pycharm
编译器版本:python3.6
需要装的包:requests, lxml, html

import requests
from lxml import etree
import  html
# 准备数据
# url = "https://movie.douban.com/top250"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
}

def detail_page_spider(detail_url):
d_response = requests.get(detail_url,headers=headers)
# 创建xpath对象
d_eroot = etree.HTML(d_response.text)
detail_summary_list = d_eroot.xpath('//span[@class="all hidden"]/text()')
if not detail_summary_list:
detail_summary_list = d_eroot.xpath('//span[@property="v:summary"]/text()')
# 处理数据
for paragraph in detail_summary_list:
clean_para = html.escape(paragraph).strip()
print(clean_para)

def get_one_page(url):
# 获得响应对象
response = requests.get(url,headers)

# 创建xpath对象
eroot = etree.HTML(response.text)

# 匹配出电影的xpath元素列表,每个电影为一个元素
element_list = eroot.xpath('//div[@class="item"]')

print('排名---中文名---外文名---别名')
# 遍历元素列表,对每一个元素再进行处理
for i in element_list:
star = i.xpath('.//div[@class="star"]/span[2]/text()')[0]
num = i.xpath('./div/em/text()')[0]
detail_link = i.xpath('./div/a/@href')[0]
cn_name = i.xpath('./div[@class="info"]/div/a/span[1]/text()')[0]  # 获取中文名,每个电影都有,直接从列表中取出字符串

en_name = i.xpath('./div[@class="info"]/div/a/span[2]/text()')   # 获取英文名,不一定有,加一个判断,如果没有的话给一个默认值
if not en_name:
en_name = '无'
else:
en_name = en_name[0].strip(' / ')  # 如果有的话,去除获取内容中的两个空格,使数据看起来干净
en_name= en_name.strip()
en_name= en_name.strip('/')
en_name= en_name.strip()

other_name = i.xpath('./div[@class="info"]/div/a/span[@class="other"]/text()')  # 获取别名,同上
if not other_name:
other_name = '无'
else:
other_name = other_name[0].strip(' / ')
other_name = other_name.strip()
other_name = other_name.strip('/')
other_name = other_name.strip()

print(num,'---',cn_name,'---',en_name,'---',other_name,'---评分',star,'---',detail_link,)
detail_page_spider(detail_link)
print('*'*100)
break

def generate_url():
# 生成所有url地址列表
url_list = []
for i in range(0,226,25):
url_raw = 'https://movie.douban.com/top250?start={}'.format(i)
url_list.append(url_raw)
# print(url_list)
return url_list

if __name__ == '__main__':
url_list = generate_url()
for url_w in url_list:
get_one_page(url_w)
break
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: