爬取猫眼电影
最近在系统的学习爬虫,为了练手,试着爬了一下猫眼的最近热播的电影。
爬取猫眼电影信息不需要登录账号,省去了设置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基础不是很好,代码其实写得不怎么样,还有许多小问题。后面会进行修改和优化的。