自动化

80 行代码爬取豆瓣 Top250 电影信息并导出到 csv 及

2017-11-15  本文已影响113人  51reboot

障碍与失败,是通往成功最稳靠的踏脚石,肯研究、利用它们,便能从失败中培养出成功。

下载页面并处理

DOWNLOAD_URL = 'http://movie.douban.com/top250/'
html = requests.get(url).text
tree = lxml.html.fromstring(html)

提取数据

观察该网站 html 结构

可知该页面下所有电影包含在 ol 标签下。每个 li 标签包含单个电影的内容。

使用 XPath 语句获取该 ol 标签

movies = tree.xpath("//ol[@class='grid_view']/li")

在 ol 标签中遍历每个 li 标签获取单个电影的信息。

image

以电影名字为例

for movie in movies:
    name_num = len(movie.xpath("descendant::span[@class='title']"))
    name = ''
    for num in range(0, name_num):
        name += movie.xpath("descendant::span[@class='title']")[num].text.strip()
    name = ' '.join(name.replace('/', '').split())  # 清洗数据

其余部分详见源码

页面跳转

检查“后页”标签。跳转到下一页面

next_page = DOWNLOAD_URL + tree.xpath("//span[@class='next']/a/@href")[0]

返回 None 则已获取所有页面。

导入 CSV

创建 CSV 文件

writer = csv.writer(open('movies.csv', 'w', newline='', encoding='utf-8'))
fields = ('rank',  'name', 'score', 'country', 'year', 'category', 'votes', 'douban_url')
writer.writerow(fields)

其余部分详见源码

导入数据库(以 mysql 为例)

先在 mysql 中创建数据库与表,表的属性应与要插入的数据保持一致

连接数据库 db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='syb123', db='douban',charset='utf8')

创建游标 cur = db.cursor()

将获取的电影信息导入数据库

sql = "INSERT INTO test(rank, NAME, score, country, year, " \
          "category, votes, douban_url) values(%s,%s,%s,%s,%s,%s,%s,%s)"
    try:
        cur.executemany(sql, movies_info)
        db.commit()
    except Exception as e:
        print("Error:", e)
        db.rollback()

效果显示

因 Windows 系统默认以 ANSI 编码打开 Excel,所以直接用 Excel 打开 csv 文件会出现乱码,需对其重新编码。

以上所有内容可以在 80 行 Python 代码内完成,很简单吧

源码:https://github.com/AlexRedfield/douban_movies_top250

原文链接:https://segmentfault.com/a/1190000011964958

技术交流群:238757010


上一篇 下一篇

猜你喜欢

热点阅读