python爬虫猫眼电影TOP100(爬虫入门基础,同步入库)

小编辗转了比较长的一段时间,现在终于提笔于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.

欢迎关注小编微信公众号:分享百科 松子 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LEEBELOVED

一分钱都是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值