爬取猫眼电影

最近在系统的学习爬虫,为了练手,试着爬了一下猫眼的最近热播的电影。

爬取猫眼电影信息不需要登录账号,省去了设置cookie等一些步骤。猫眼电影中有很多个栏目,我爬取的则是“正在热映”这个栏目(截图如下)。本次爬取用的是python的requests模块以及xpath。

 

爬取猫眼电影

 

点击图中的“全部”即可获得该页面的url。在浏览器开发者工具下,可以看出每部电影的海报以及评分在<dl class="movie-list">中,其中每一个<dd>标签都包含一部电影的信息。这个就是我们的目标,我们可以从<dd>标签中通过xpath来提取信息。但是有意思的一点是,评分这一项信息是有坑的。分析标签可以看到,如果有评分的话,评分的整数部分和小数部分是分别放在两个<i>标签的。但是暂无评分的话,就是放在<div>标签里,所以想要直接一次性把评分提取出来,比较困难。可以采用点小技巧,直接将评分这一部分全部爬取下来,然后将有评分的部分筛选出来,使用拼接字符串的方法,将评分补全。

 

爬取猫眼电影

爬取猫眼电影

 

数据爬取之后,将数据保存在mysql中,还需要使用的pymysql模块。话不多说,直接上代码吧。

import requests
from lxml import etree
import pymysql
pymysql.install_as_MySQLdb()
db = pymysql.connect(host="localhost", user="root", password="xxxxxx", charset="utf8", db="python")
cursor = db.cursor()


def run(url):
    response = requests.get(url=url)
    # parser = etree.HTMLParser()
    html = etree.HTML(response.text)
    dl = html.xpath("//div/div[2]/div[2]/dl")
    for dd in dl:
        names = dd.xpath(".//div[2]/a/text()")
        scores = dd.xpath(".//div[3]//text()")
    count = len(scores)
    print(count)
    for i in range(0, count):
        if len(scores[i]) == 2 and len(scores[i+1]) == 1:
            scores[i] = scores[i]+scores[i+1]
    # print(scores)
    cursor.execute("""CREATE TABLE `mao_yan`  (
                            `id` int(20),
                            `name` varchar(255) NULL,
                            `score` varchar(255) NULL,
                            PRIMARY KEY (`id`));""")
    i = 0
    for name in names:
        score = scores[i]
        if len(score) >= 3:
            cursor.execute('INSERT INTO mao_yan(id,name,score) VALUE ("%d","%s","%s");' % (i+1, name, score))
            db.commit()
            i = i+1
        else:
            i = i + 1
            continue
    cursor.close()
    db.close()


if __name__ == '__main__':
    url = "https://maoyan.com/films?showType=1"
    run(url=url)

在Navicat中可以查看到程序执行的结果。

爬取猫眼电影

当然,由于python基础不是很好,代码其实写得不怎么样,还有许多小问题。后面会进行修改和优化的。