猫眼电影爬取(⼀):requests+正则,并将数据存储到mysql数据库前⾯讲了如何通过pymysql操作数据库,这次写⼀个爬⾍来提取信息,并将数据存储到mysql数据库
1.爬取⽬标
爬取猫眼电影TOP100榜单
要提取的信息包括:电影排名、电影名称、上映时间、分数
2.分析⽹页HTML源码
可以看到每部电影信息都被包裹在⼀对<dd>...</dd>标签中,所以我们只需提取出⼀个标签对中的上述信息即可。使⽤正则表达式提取
3. 完整过程
这个例⼦有2个关键点:正则编写和数据处理(写进mysql数据库)
(1) 正则表达式的编写
pattern = repile(r'<dd>.*?<i.*?>(\d+)</i>.*?' # 匹配电影排名(加个?表⽰⾮贪婪匹配,不是匹配0次或1次)
r'<p class="name"><a.*?data-val=".*?">(.*?)' # 匹配电影名称
r'</a>.*?<p.*?class="releasetime">(.*?)</p>' # 匹配上映时间
r'.*?<i.*?"integer">(.*?)</i>' # 匹配分数的整数位
r'.*?<i.*?"fraction">(.*?)</i>.*?</dd>', re.S) # 匹配分数⼩数位,re.S表⽰跨⾏匹配
m = pattern.findall(html)
# print(m)
使⽤findall()⽅法来匹配所有符合规则的字符,返回⼀个列表,下⾯是其中⼀页的匹配结果
(2)完整代码,注意get_data()函数是如何处理数据,然后通过write_sql()函数是写⼊数据库的
# coding: utf-8
# author: hmk
import requests
import re
import pymysql
def get_html(url, header):
response = (url, headers=header)
if response.status_code == 200:
else:
return None
def get_data(html, list_data):
pattern = repile(r'<dd>.*?<i.*?>(\d+)</i>.*?' # 匹配电影排名
r'<p class="name"><a.*?data-val=".*?">(.*?)' # 匹配电影名称
r'</a>.*?<p.*?class="releasetime">(.*?)</p>' # 匹配上映时间
r'.*?<i.*?"integer">(.*?)</i>' # 匹配分数的整数位
r'.*?<i.*?"fraction">(.*?)</i>.*?</dd>', re.S) # 匹配分数⼩数位
m = pattern.findall(html)
for i in m: # 因为匹配到的所有结果会以列表形式返回,每部电影信息以元组形式保存,所以可以迭代处理每组电影信息
ranking = i[0] # 提取⼀组电影信息中的排名
movie = i[1] # 提取⼀组电影信息中的名称
release_time = i[2] # 提取⼀组电影信息中的上映时间
score = i[3] + i[4] # 提取⼀组电影信息中的分数,这⾥把分数的整数部分和⼩数部分拼在⼀起
list_data.append([ranking, movie, release_time, score]) # 每提取⼀组电影信息就放到⼀个列表中,同时追加到⼀个⼤列表⾥,这样最后得到的⼤列表就包含所有电影信息def write_sql(data):
conn = t(host='localhost',
user='root',
password='123456',正则匹配0到15
db='test',
charset='utf8')
cur = conn.cursor()
for i in data:
"""这⾥的data参数是指正则匹配并处理后的列表数据(是⼀个⼤列表,包含所有电影信息,每个电影信息都存在各⾃的⼀个列表中;
对⼤列表进⾏迭代,提取每组电影信息,这样提取到的每组电影信息都是⼀个⼩列表,然后就可以把每组电影信息写⼊数据库了)"""
movie = i # 每组电影信息,这⾥可以看做是准备插⼊数据库的每组电影数据
sql = "insert into maoyan_movie(ranking,movie,release_time,score) values(%s, %s, %s, %s)" # sql插⼊语句
try:
connmit() # 插⼊完成后,不要忘记提交操作
print('导⼊成功')
except:
print('导⼊失败')
cur.close() # 关闭游标
conn.close() # 关闭连接
def main():
start_url = 'maoyan/board/4'
depth = 10 # 爬取深度(翻页)
header = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "maoyan",
"Referer": "maoyan/board",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36"} for i in range(depth):
url = start_url + '?offset=' + str(10 * i)
html = get_html(url, header)
list_data = []
get_data(html, list_data)
write_sql(list_data)
#print(list_data)
# for i in list_data:
# t = i
# print(t)
if __name__ == "__main__":
main()
注意⼀点,在请求url时,加了headers,这⾥必须加,估计是⽹站做了限制,直接爬的话会失败,可能认出请求链接的不是⼀个⼈⽽是⼀只⾍了代码中注释写得很详细,不再过多描述了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论