小编辗转了比较长的一段时间,现在终于提笔于python的运用,这次尝试也是一个开端。
本篇文章所爬取的数据网上已经有了很多版本,并不是什么新鲜的数据,仅仅作为个人进阶的参考。
python爬虫进阶第S190811期
python爬虫将会进一步深入到JavaScript渲染网页(动态渲染)、验证码识别、代理设置、cookies池搭建等,有兴趣的同道中人可以持续关注哈。
本次尝试爬取小量电影数据并同步存入数据库作为预热哈。
下面代码分为三块:请求、解析网页的模块;网页数据获取模块;数据同步入库模块
#需要用到的包载入
import requests
from requests.exceptions import RequestException
import lxml
from lxml import etree
import pymysql
import time
#定义headers,请求网页并获取网页响应状态,解析网页,设置休眠时间,防止封禁,当然如此小的数据量不存在的
def main():
url = 'http://maoyan.com/board/4?offset='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT k0.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.kk0 Safari/537.36'}
for i in range(10):
my_url=url+str(10*i)
url_response = requests.get(my_url,headers=headers)
html_analysis = etree.HTML(url_response.text)
md=[]
get_data(html_analysis,md)
insert_sql(md)
time.sleep(1)
#利用lxml库xpath获取网页数据
def get_data(html_analysis,md):
#电影名称
name=html_analysis.xpath("//div[@class='movie-item-info']/p/a/@title")
#电影主演,里面的人有多个,没有进行拆分,有需要可以进行拆分
actor=html_analysis.xpath("//div[@class='movie-item-info']/p[@class='star']/text()")
#电影上映时间
time=html_analysis.xpath("//div[@class='movie-item-info']/p[@class='releasetime']/text()")
#电影评分(整数部分)
score_int=html_analysis.xpath("//div[@class='board-item-content']/div[contains(@class,'movie-item-number')]/p[@class='score']/i[@class='integer']/text()")
#电影评分(小数部分)
score_float=html_analysis.xpath("//div[@class='board-item-content']/div[contains(@class,'movie-item-number')]/p[@class='score']/i[@class='fraction']/text()")
#电影封面地址,没有下载,只是获取了地址,根据需求可以下载了存储
img=html_analysis.xpath("//a/img/@src")
#拼接电影评分
score=[]
for j in range(0,len(score_int)):
score.append(score_int[j]+score_float[j])
#整合每页数据,构造循环,用append函数实现
for k in range(0,len(name)):
movie_name=name[k].strip()
movie_actor=actor[k].strip()
movie_time=time[k].strip()
movie_score=score[k].strip()
movie_img=img[k].strip()
md.append([movie_name,movie_actor,movie_time,movie_score,movie_img])
#连接数据库,创建对应数据库的电影数据存储表,便于数据爬取后存入
db=pymysql.connect(host='localhost', user='root', password='密码', port=3306,db='数据库')
cursor = db.cursor()
#创建电影数据存储表的语句用游标写,若已经存在创建的表则不会重复创建,当然这个表的参数设置是有些不合理的哈
sql_create='create table if not exists my_movie_data(id int auto_increment primary key,' \
'movie_name varchar(255) not null,' \
'movie_actor varchar(255) not null,' \
'movie_time varchar(255) not null,' \
'movie_score varchar(255) not null,' \
'movie_img varchar(255) not null )'
cursor.execute(sql_create)
db.close()
#数据同步入库
def insert_sql(data):
db = pymysql.connect(host='localhost',
user='root',
password='密码',
port=3306,
db='数据库')
cur = db.cursor()
for i in data:
my_data=i
#用格式化符%s来避免插入数据字符拼接的问题,value值用统一的元组来传递避免出错
sql = 'insert into my_movie_data(movie_name,movie_actor,movie_time,movie_score,movie_img) values(%s,%s,%s,%s,%s)'
#用游标把数据同步入库,当发生错误时候便会回滚,取消错误插入
try:
cur.execute(sql,my_data)
db.commit()
print('猫眼电影数据正在入库')
except:
db.rollback()
print('猫眼电影数据入库失败')
cur.close()
db.close()
#模块调用,当name与main一致时候,在本脚本运行时候name=main,输出本脚本的结果;在其他脚本运行时候name!=main,若在其他脚本中调用模块则输出其他脚本的结果,不会执行main模块
if __name__== "__main__":
main()
电影数据入库(mysql)截图:
下一篇可能是猫眼电影2.8w+经典电影数据
Any questions or doubts here,call me please,together to work it out.
欢迎关注小编微信公众号:分享百科 松子