文章目录

  • 一、pyhton连接mysql数据库
  • 二、用xpath抓取有用信息
  • 说几个比较容易掉坑的地方
    • 效果

一、pyhton连接mysql数据库

我是写了一个py文件来封装一下,然后在爬取猫眼的py文件里直接调用,需要使用到pymysql库, 没有安装这个库的同学要事先安装一下,这里直接上代码

#coding=utf-8
import pymysqlclass mysqlConn:def get_conn(self, dbname):"""提供你要连接的数据库名,并连接数据库"""self.conn = pymysql.connect(host="127.0.0.1",user="root",password="你的密码",db=dbname, #可选择要连接的数据库名charset="utf8")self.cur = self.conn.cursor()def exe_sql(self, sql):"""执行不返回结果的sql语句, 例如增删改"""self.cur.execute(sql)self.conn.commit()# print("事物提交成功")def select_sql(self, sql):"""执行查询语句"""self.cur.execute(sql)return self.cur.fetchall()def close_conn(self):if self.cur:self.cur.close()if self.conn:self.conn.close()if __name__ == "__main__":#找一个数据库表来执行一下看能不能行connection = mysqlConn()connection.get_conn("school") #连接'school'数据库sql = '''insert into student2 (name, nickname) values ("赵六", "六娃")'''connection.exe_sql(sql)connection.close_conn()

注意文件开头有个#coding=utf-8,不写会提示一个小报错,以前都没写这个的习惯,看来以后要习惯写了
来看看结果

二、用xpath抓取有用信息

猫眼电影网站地址: https://maoyan.com/films?showType=3
先来看最后的数据库,看看我们要抓取哪些信息

从图上可以看出我们要抓取电影名字, 电影海报的链接, 电影详情页的链接, 电影的介绍,以及演员表.
现在看猫眼首页


从这里我们已经能发现他网址变换的规律了
再抓取第一页的网址里不同电影的信息
先看海报地址

这里用了一个抓xpath的插件工具(XPath Helper),没有的同学可以去谷歌应用商店下载,安装之后按快捷键Ctrl+Shift+X就可以快速使用了

ok,现在电影首页的内容需要的两个内容已经抓取完毕,剩下的内容需要到详情页来抓取,我们先写一段首页抓取的代码来看看效果

#coding=utf-8
import requests
from lxml import etree
from fake_useragent import UserAgent# 这里用了一个可以随机模拟请求头的库,因为一天内爬太多次导致频繁要验证,用随意模拟的请求头会好很多
# 感兴趣的小伙伴可以自己'pip install fake_useragent', 不感兴趣可以直接用普通的请求头
headers = {"User-Agent": UserAgent().random
}
url = 'https://maoyan.com/films?showType=3'
print("url: " + url)
resp = requests.get(url=url, headers=headers)
tree = etree.HTML(resp.text)
# 完整的图片地址,可以直接打开
img_ar = tree.xpath('//dl/dd//img[2]/@src')
# 只有地址的后半段,需要拼接'https://maoyan.com/'
urls_ar = tree.xpath('//dd/div[@class="movie-item film-channel"]/a/@href')#打印出来看看数据爬到没有
print(img_ar)
print(urls_ar)


发现详情页地址抓到了,图片地址没抓到???真是原地裂开,到这里我也懵逼了一阵,以为是自己xpath没写对,那看来现在只能debug了,咱先打个断点

那现在我们将抓取图片的xpath改为’//dl/dd//img[2]/@data-src’再来试试,发现已经能成功抓取
现在我们来抓取详情界面信息的演员表
其中电影名字和简介都比较好抓,我就不截图了,一会一直贴xpath,你可以自己抓一抓

这里你可以尝试下其他写法,就不多重复了
爬取详情页的代码

headers = {"User-Agent": UserAgent().random
}
url = 'https://maoyan.com/films/1218029'print("url: " + url)
resp = requests.get(url=url, headers=headers)tree = etree.HTML(resp.content.decode("utf-8"))
name = str(tree.xpath('string(//h1)')) #转为py内置的str类型,保险点
print("正在储存电影<{}>......".format(name))
actors_ar = tree.xpath('//div[@class="celebrity-group"][2]//li/div[@class="info"]/a/text()')  # 演员列表
types = tree.xpath('string(//li[@class="ellipsis"])').replace("\n", "").replace(" ", "")  # 字符串
intro = str(tree.xpath('string(//span[@class="dra"])'))
actors = '|'.join(actors_ar).replace("\n", "").replace(" ", "") #将演员列表拼接为字符串

结果你们可以自己去打印一下,如果没有遇到验证码就能爬到了

最后的抓取猫眼电影的全部代码,封装成类,养成良好的代码习惯

import requests
from lxml import etree
from mysql_api import mysqlConn
from fake_useragent import UserAgent
from pymysql import errclass maoYan_spider:headers = {"User-Agent": UserAgent().random}def get_urls(self, url):"""返回一个电影首页捕获到的所有海报地址和电影详情url"""print("url: " + url)resp = requests.get(url=url, headers=self.headers)tree = etree.HTML(resp.text)# 完整的图片地址,可以直接打开img_ar = tree.xpath('//dl/dd//img[2]/@data-src')# 只有地址的后半段,需要拼接'https://maoyan.com'urls_ar = tree.xpath('//dd/div[@class="movie-item film-channel"]/a/@href')#只有py具有返回多个参数的特性,其他语言只能返回一个return img_ar, urls_ardef save_data(self, img_src, url):"""将电影详情写入数据库"""#print("url: " + url)resp = requests.get(url=url, headers=self.headers)tree = etree.HTML(resp.content.decode("utf-8"))name = str(tree.xpath('string(//h1)'))print("正在储存电影<{}>......".format(name))if name == "":print("遇到验证码, 程序停止")return Falseactors_ar = tree.xpath('//div[@class="celebrity-group"][2]//li/div[@class="info"]/a/text()')  # 演员列表types = tree.xpath('string(//li[@class="ellipsis"])').replace("\n", "").replace(" ", "")  # 字符串intro = str(tree.xpath('string(//span[@class="dra"])'))actors = '|'.join(actors_ar).replace("\n", "").replace(" ", "") #将演员列表拼接为字符串sql = 'insert into maoyan (m_name, m_type, m_src, m_link, m_intro, m_actors) values ("%s","%s","%s","%s","%s","%s")' % (name, types, img_src, url, intro, actors)try:self.connect.exe_sql(sql)except err.ProgrammingError:print("该条编码有问题,舍弃")return Truedef run(self):self.connect = mysqlConn()self.connect.get_conn("movies")tag = True#爬取前两页的电影for i in range(2):main_url = "https://maoyan.com/films?showType=3&offset={}".format(30 * i)imgs, urls = self.get_urls(main_url)if len(imgs) == 0:print("遇到验证码, 程序停止")print("再次尝试...")imgs, urls = self.get_urls(main_url)for img, url in zip(imgs, urls):img = img.split('@')[0]url = 'https://maoyan.com' + urltag = self.save_data(img, url)while not tag:tag = Trueprint("再次尝试...")tag = self.save_data(img, url)self.connect.close_conn()if __name__ == "__main__":# conn1 = mysqlConn()# conn1.get_conn("movies")# sql = """create table maoyan(#         m_id int primary key auto_increment,#         m_name varchar(30) not null,#         m_type varchar(20) null,#         m_src varchar(100) not null,#         m_link varchar(100) not NULL,#         m_intro text null,#         m_actors text null#         )default charset = utf8"""# conn1.exe_sql(sql)# conn1.close_conn()spider = maoYan_spider()spider.run()


这是我连接数据库文件和爬取文件的位置,大概在同一个目录下就行了,你可以写在和同一个抓电影同一个页面下然后’from .mysql_api import mysqlConn’

说几个比较容易掉坑的地方


这一段代码是建表的,前提是你要先自己在mysql里建好movies数据库
然后把这一段解除注释,把前面两行代码先注释了,然后运行,运行之后会有一个字符集编码警告,这个不打紧,运行结束你就可以注释掉这一段代码,然后将下面两行解除注释,开始爬虫,当然你也可以在数据库里先建好表,我是因为之前只用py写过增删改查,就想试试建表,不要问我为什么m_actors给了text类型,原本给了varchar(200),后来提示不够写,改成400还不够,我就去看了看是谁演员这么多—复联


这个sql语句,要注意占位符两边有双引号(一定要是双引号,因为在数据库里单引号有特殊意义,我查的文章里这么说的,具体是啥目前还不懂),我原先里面用了单引号,外面包裹sql的用的双引号,导致有好几个页面会引发’pymysql.err.ProgrammingError’, 我一直找不到问题所在,就只能捕获异常了,后来改了单引号就没这毛病了.

其他还有问题可以评论区留言讨论,今天算是学习爬虫几天以来第一个不看视频,自己独立抓完的作业啦,嘻嘻

效果

Python之requests+xpath爬取猫眼电影并写入数据库(图文教程)相关推荐

  1. python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程

    python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程 前言 一丶整体思路 二丶遇到的问题 三丶分析URL 四丶解析页面 五丶写入文件 六丶完整代码 七丶最后 前言 大家好我是墨绿 头顶总 ...

  2. 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP

    爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...

  3. 爬虫从头学之Requests+正则表达式爬取猫眼电影top100

    爬取思路 当我们想要爬取一个页面的时候,我们要保证思路清晰,爬虫的思路分四个步骤,发起请求,获取响应内容,解析内容,存储内容.根据这四个内容我们的思路就很清晰.以下为具体步骤 使用requests库爬 ...

  4. Python爬虫实战 | (1) 爬取猫眼电影官网的TOP100电影榜单

    在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的片名,主演,上映日期,评分和封面等内容. 打开猫眼Top100,分析URL的变化:发现Top ...

  5. 利用requests库和Xpath爬取猫眼电影榜单【Python】

    博主的前几篇有关定向网络爬虫的博客,在解析HTML界面时,都是运用了BeautifulSoup和re库进行解析,这篇博客写一下怎么用Xpath语法进行HTML界面解析,从而得到我们想要的结果. 说明 ...

  6. Python爬虫实战01:Requests+正则表达式爬取猫眼电影

    1 目标站点的分析 2 流程框架 抓取单页内容 利用requests请求目标站点,得到单个网页HTML代码,返回结果. 正则表达式分析 根据HTML代码分析得到电影的名称.主演.上映.时间.评分.图片 ...

  7. Python实战之如何爬取猫眼电影排行?本文详解

    本节中,我们利用requests库和正则表达式来抓取猫眼电影TOP100的相关内容.requests比urllib使用更加方便,而且目前我们还没有系统学习HTML解析库,所以这里就选用正则表达式来作为 ...

  8. 小白学python-实战-爬取猫眼电影信息

    这次我们来学习爬去猫眼电影前100名的电影 1.首先我们打开猫眼电影top100的网页:http://maoyan.com/board/4? 我们发现有offset=页数,来进行翻页 2.我们打开py ...

  9. Python爬虫系列之爬取猫眼电影,没办法出门就补一下往期电影吧

    前言 今天给大家介绍利用Python爬取并简单分析猫眼电影影评.让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: requests模块: pyecharts模块: jieba模 ...

最新文章

  1. bigdecimal类型数据的min方法
  2. 文巾解题 1816. 截断句子
  3. 2021-04-21--中标麒麟-yum源修改
  4. toggle 1.9 以后就被删除了
  5. 2020-12-03 The Geometry of Rotations and Rigid-Body Motions (刚体运动和旋转的几何表示,罗德里格参数)
  6. Python Django框架根据模型不能新建表
  7. 使用Mockito模拟自动装配的字段
  8. vsftpd默认用户名/密码
  9. 错误: 句法分析器6行里不能有多字节字符_字节跳动iOS客户端面经第一期
  10. jQuery学习笔记(五)
  11. 神经网络的Hello World
  12. mysql数据库undo日志恢复_MySQL的undo/redo日志和binlog日志,以及2PC
  13. 软件工程毕设(三)·进度考核表
  14. 终于解决了x64 win7上运行金山词霸的问题
  15. 极大值极小值搜索设计五子棋
  16. 微信小程序vtabs
  17. 使用结构化思维,让工作有条不紊
  18. jpa 清空数据库的写法
  19. OpenCV图像的基本操作
  20. 小程序实战—答题类小程序

热门文章

  1. 微信跳转链接,实现微信内置浏览器跳转外部浏览器打开指定链接
  2. 缺陷管理工具 之JIRA使用教程
  3. 宇枫资本什么是第三方理财
  4. 吴永辉教授2021年讲课3-4题解
  5. CASE语句的使用方法
  6. openssl基础(一)命令行工具
  7. 麦块服务器怎么注册的视频,我的世界麦块服务器怎么注册密码
  8. JAVA校验SQL语句与格式化语句
  9. vue利用prerender-spa-plugin预渲染
  10. linux 磁盘io监控