猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库
2023-09-11 14:21:25 时间
前面讲了如何通过pymysql操作数据库,这次写一个爬虫来提取信息,并将数据存储到mysql数据库
1.爬取目标
爬取猫眼电影TOP100榜单
要提取的信息包括:电影排名、电影名称、上映时间、分数
2.分析网页HTML源码
可以看到每部电影信息都被包裹在一对<dd>...</dd>标签中,所以我们只需提取出一个标签对中的上述信息即可。使用正则表达式提取
3. 完整过程
这个例子有2个关键点:正则编写和数据处理(写进mysql数据库)
(1) 正则表达式的编写
pattern = re.compile(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 = requests.get(url, headers=header)
if response.status_code == 200:
return response.text
else:
return None
def get_data(html, list_data):
pattern = re.compile(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 = pymysql.connect(host='localhost',
user='root',
password='123456',
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:
cur.execute(sql, movie) # 执行sql语句,movie即是指要插入数据库的数据
conn.commit() # 插入完成后,不要忘记提交操作
print('导入成功')
except:
print('导入失败')
cur.close() # 关闭游标
conn.close() # 关闭连接
def main():
start_url = 'http://maoyan.com/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.com",
"Referer": "http://maoyan.com/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,这里必须加,估计是网站做了限制,直接爬的话会失败,可能认出请求链接的不是一个人而是一只虫了
代码中注释写得很详细,不再过多描述了
相关文章
- Mysql远程连接数据库报错排查:pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '**.**.**.**' (timed out)")
- mysql-介绍、MySQL部署、数据类型、存储引擎
- 【MySQL】批量删除mysql中数据库中的表
- 【MySql】mysql 数据库数据订正
- MySQL命令行导入导出数据库
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
- 第二百七十九节,MySQL数据库-pymysql模块操作数据库
- mysql数据库建模Navicat
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
- MYSQL错误解决:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- 使用mysql-connector-python操作MYSQL数据库
- Mysql一个非常有用的内置函数今天碰到要把MySQL数据库中的varchar转换成date类型进
- 数据库内核月报 - 2015 / 07-MySQL · TokuDB · TokuDB Checkpoint机制
- mysql 必知必会整理—全球化与本地化[十六]
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)--续
- MYsql 数据库密码忘记(Window)-2(mysql 5.7)
- Atitit postgresql data type 数据类型与mysql对应表 数据库常用数据类型 PostgreMysql 整数intgreterInt 小数numericFL
- 数据库面试要点:关于MySQL数据库千万级数据查询和存储
- Java连接MySQL数据库
- MySQL Study之--Mysql无法启动“mysql.host”
- MYSQL提权之反弹SHELL——数据库提权属于webshell到管理员的纵向提权,本质还是利用udf提权,无非是在mysql自定义函数中使用了反弹shell而已
- Groonga开源搜索引擎——列存储做聚合,没有内建分布式,分片和副本是随mysql或者postgreSQL作为存储引擎由MySQL自身来做分片和副本的
- windows上同时安装多个版本的mysql数据库
- 【MySQL数据库原理】Python3连接 MySQL 数据库并批量创建表、批量插入sql语句数据库