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

查看源码


1 下载页面并处理

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

2 提取数据

观察该网站html结构
观察该网站html结构

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

使用XPath语句获取该ol标签

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

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

以电影名字为例

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())  # 清洗数据

其余部分详见源码


3 页面跳转

图片描述

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

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

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


4 导入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)

其余部分详见源码


5 导入数据库(以mysql为例)

  1. 先在mysql中创建数据库与表,表的属性应与要插入的数据保持一致
  2. 连接数据库db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd=PWD, db='douban',charset='utf8')
    创建游标cur = db.cursor()
  3. 将获取的电影信息导入数据库
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()

6 效果显示

图片描述
图片描述

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

以上所有内容可以在80行Python代码内完成,很简单吧。(`・ω・´)


python学习
python知识以及一些有趣的语法糖

Python,Data Analysis,Machine Learing

48 声望
9 粉丝
0 条评论
推荐阅读
Docker操作常用命令-镜像篇
Docker Registry 默认为Docker Hub,地址格式为<IP/域名>例:docker pull ubuntu:16.04

homura阅读 3k

分布式高可用Mysql数据库Percona XtraDB Cluster 8.0 与 Proxysql 史上最详尽用法指南
PXC是Percona XtraDB Cluster的缩写,是 Percona 公司出品的免费MySQL集群产品。PXC的作用是通过mysql自带的Galera集群技术,将不同的mysql实例连接起来,实现多主集群。在PXC集群中每个mysql节点都是可读可写的...

apollo0084阅读 7.2k评论 2

一次偶然机会发现的MySQL“负优化”
今天要讲的这件事和上述的两个sql有关,是数年前遇到的一个关于MySQL查询性能的问题。主要是最近刷到了一些关于MySQL查询性能的文章,大部分文章中讲到的都只是一些常见的索引失效场合,于是我回想起了当初被那个...

骑牛上青山6阅读 1.6k评论 2

MongoDB 插入时间与更新时间(create_time/update_time)
MongoDB 在数据库层面不能像 MySQL 一样设置自动创建 create_time/update_time,自动更新 update_time

qbit阅读 13.9k评论 2

Mysql索引覆盖
通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个查询,而不仅仅是where条件部分,还应该关注查询所包含的列。索引确实是一种高效的查找数据方式,但...

京东云开发者2阅读 695

封面图
SegmentFault 思否技术周刊 Vol.70 — 深入 MySQL 实战
MySQL 软件采用了 GPL( GNU 通用公共许可证),由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了 MySQL 作为网站数据库。

Beverly2阅读 1.4k

封面图
python里打印list的四种方法
原文链接标题:Print lists in Python (4 Different Ways)用for循环来打印 {代码...} 结果1 2 3 4 5用 * 星号来打印 {代码...} 结果 {代码...} 把list转换为str来打印 {代码...} 结果 {代码...} 用map把数组里非...

chiiinnn阅读 10.3k

封面图

Python,Data Analysis,Machine Learing

48 声望
9 粉丝
宣传栏