在之前的博客中,小菌分享了几篇关于python爬虫的小程序,受到了许多小伙伴们的认可,小菌还是比较激动٩(๑>◡<๑)۶,毕竟小菌毕竟不是python方向的,很多的内容都是自己找资料自学的。同样本篇博客,小菌将继续分享实用的爬虫—获取豆瓣电影Top250的内容,并保存在MySQL数据库中。
关于豆瓣电影在百度百科上的描述,如下:
豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务。你可以记录想看、在看和看过的电影电视剧,顺便打分、写影评。极大地方便了人们的生活。
是不是心动了,嘿嘿~我们先根据网址https://movie.douban.com/top250
来到豆瓣Top250的官网页面。
我们发现该网页共有十页的数据!
关于如何获取到这些数据呢?我们需要现在MySQL中将我们储存信息的表先创建出来。
在MySQL执行以下建表语句:
`
create table doubanmovie
(
name TEXT null,
director TEXT null,
actor TEXT null,
style TEXT null,
country TEXT null,
release_time TEXT null,
time TEXT null,
score TEXT null
);
`
我们可以看到此时数据表已经创建好,此时还没有数据。
接下来就要开始爬虫数据装进我们数据库的表格中了。话不多说,先上代码:
"""
@File : 豆瓣电影Top250(手动).py
@Time : 2019/10/28 9:27
@Author : 封茗囧菌
@Software: PyCharm
转载请注明原作者
创作不易,仅供分享
"""
import requests
from lxml import etree
import re
import pymysql
import time
# 导入相关的库文件
# Request 库用于请求网页
# Lxml 和 re 库用户解析爬取网页数据
# PyMySQL 库 用于对MySQL 数据库的操作
# time 库的sleep() 方法 可以让程序暂停
# conn为连接对象,用于连接数据库
conn = pymysql.connect(host='localhost', user='root', passwd='root', db='day0720', port=3306, charset='utf8')
# cursor 为光标对象,用于操作MySQL数据库
cursor = conn.cursor()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
} # 加入请求头
def get_movie_url(url): # 定义用于获取详情页URL的函数
html = requests.get(url, headers=headers)
selector = etree.HTML(html.text)
movie_hrefs = selector.xpath("//div[@class='hd']/a/@href")
for movie_href in movie_hrefs:
get_movie_info(movie_href) # 调用获取详情页信息的函数
def get_movie_info(url): # 定义获取详情页信息的函数
html = requests.get(url, headers=headers)
selector = etree.HTML(html.text)
try:
name = selector.xpath('//*[@id="content"]/h1/span[1]/text()')[0]
director = selector.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
# 当遇到标签套标签的情况,想获取里面的文本值,可以使用string(.)
actors = selector.xpath('//*[@id="info"]/span[3]/span[2]')[0]
actor = actors.xpath('string(.)')
# 这里用了正则表达式
style = re.findall('<span property="v:genre">(.*?)</span>', html.text, re.S)[0]
country = re.findall('<span class="pl">制片国家/地区:</span> (.*?)<br/>', html.text, re.S)[0]
release_time = re.findall('上映日期:</span>.*?>(.*?)</span>', html.text, re.S)[0]
time = re.findall('片长:</span>.*?>(.*?)</span>', html.text, re.S)[0]
score = re.findall('<strong class="ll rating_num" property="v:average">(.*?)</strong>',html.text, re.S)[0]
# 获取信息插入数据库
cursor.execute(
"insert into doubanmovie1 (name,director,actor,style,country,release_time,time,score) values(%s,%s,%s,%s,%s,%s,%s,%s)",
(str(name), str(director), str(actor), str(style), str(country), str(release_time), str(time), str(score)))
# pass掉IndexError错误
except IndexError:
pass
# 程序主入口
if __name__ == '__main__':
urls = ['https://movie.douban.com/top250?start={}'.format(str(i)) for i in range(0, 250, 25)]
for url in urls:
# 构造urls 并循环调用函数
get_movie_url(url)
# 睡眠2秒
time.sleep(2)
conn.commit()
代码分析:
(1)第1~5行导入程序程序所需要的库,Requests库用于请求网页,Lxml库和re库用于解析爬取
网页数据,PyMySQL库用于对MySQL数据库的操作,time库的sleep()方法可以让程序暂停。
(2)第7~9行用于连接MySQL数据库和集合
(3)第11~14行通过Chrome浏览器的开发者工具,复制User-Agent,用于伪装成浏览器,
便于爬虫的稳定性.
(4)第16~21行代码定义了获取详细页链接的函数,这里通过Xpath语法来提取标签中的href信息,
最后调用获取爬虫信息的get_movie_info()函数。
(5)第23~44行定义了获取电影信息的函数,通过Xpath语法和正则表达式方法来获取爬虫信息,
最后存储在了MySql数据库中。
声明:
在爬虫过程中,出现了IndexError的错误,这是因为有些电影的链接已经不存在了,这里通过try()函数来处理异常,以使爬虫程序继续运行而不报错!
运行程序,效果图如下:
可以看见我们的数据库中,存储着豆瓣电影Top250的数据,说明我们的爬虫程序成功了!那本次的分享也就到这里了,学到了的小伙伴们不要忘了点赞并关注小菌吖~点赞加关注,小白不迷路ヾ(๑╹◡╹)ノ"