Python 爬虫实现:抓取电影网站信息并入库
文章目录
- 一.环境搭建
- 1.下载安装包
- 2.修改环境变量
- 3.安装依赖模块
- 二.代码开发
- 三.运行测试
- 1.新建电影信息表
- 2.代码运行
- 四.问题排查和修复
- 1.空白字符报错
- 2.请求报错
一.环境搭建
1.下载安装包
访问 Python官网下载地址:https://www.python.org/downloads//
下载适合自己系统的安装包:
我用的是 Windows 环境,所以直接下的 exe 包进行安装。
下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。
2.修改环境变量
- 右键点击"计算机",点击"属性";
- 然后点击"高级系统设置"-“环境变量”;
- 选择"系统变量"窗口下面的 “Path” ,添加 python 安装路径;
- 设置成功以后,在cmd命令行,输入命令"python",有显示则说明配置成功。
3.安装依赖模块
我们的爬取程序需要安装的依赖模块包括 requests,lxml,pymysql ,步骤如下:
- 进入python安装目录下的Scripts目录,点击地址栏输入“cmd” 打开命令行工具:
- 在这个路径下安装对应的 requests,lxml,pymysql 依赖:
- 需要输入的命令:
// 安装requests依赖
pip install requests// 安装lxml依赖
pip install lxml// 安装pymysql依赖
pip install pymysql
二.代码开发
开发 collectMovies.py
#!/user/bin env python
# 获取电影天堂详细信息
import requests
import time
from lxml import etree
import pymysql
requests.adapters.DEFAULT_RETRIES = 5
# 伪装浏览器
HEADERS ={'User-Agent':'Mozilla/5.(Windows NT 10.0; WOW64) AppleWebKit/537.3(KHTML, like Gecko) Chrome/63.0.3239.13Safari/537.36','Host':'www.dy2018.com'
}
# 定义全局变量
BASE_DOMAIN = 'https://www.dy2018.com/'
# 获取首页网页信息并解析
def getUrlText(url,coding):s = requests.session()#print("获取首页网页信息并解析:", url)respons = s.get(url,headers=HEADERS)print("请求URL:", url)if(coding=='c'):urlText = respons.content.decode('gbk')html = etree.HTML(urlText) # 使用lxml解析网页else:urlText = respons.texthtml = etree.HTML(urlText) # 使用lxml解析网页s.keep_alive = Falsereturn html# 获取电影详情页的href,text解析
def getHref(url):html = getUrlText(url,'t')aHref = html.xpath('//table[@class="tbspan"]//a/@href')print("获取电影详情页的href,text解析```")htmlAll = map(lambda url:BASE_DOMAIN+url,aHref) # 给每个href补充BASE_DOMAINreturn htmlAll# 使用content解析电影详情页,并获取详细信息数据
def getPage(url):html = getUrlText(url,'c')moveInfo = {} # 定义电影信息mName = html.xpath('//div[@class="title_all"]//h1/text()')[0]moveInfo['movie_name'] = mNamemDiv = html.xpath('//div[@id="Zoom"]')[0]mImgSrc = mDiv.xpath('.//img/@src')moveInfo['image_path'] = mImgSrc[0] # 获取海报src地址if len(mImgSrc) >= 2:moveInfo['screenshot'] = mImgSrc[1] # 获取电影截图src地址mContnent = mDiv.xpath('.//text()')def pares_info(info,rule):''':param info: 字符串:param rule: 替换字串:return: 指定字符串替换为空,并剔除左右空格'''return info.replace(rule,'').strip()for index,t in enumerate(mContnent):if t.startswith('◎译 名'):name = pares_info(t,'◎译 名')moveInfo['translation']=nameelif t.startswith('◎片 名'):name = pares_info(t,'◎片 名')moveInfo['movie_title']=nameelif t.startswith('◎年 代'):name = pares_info(t,'◎年 代')moveInfo['movie_age']=nameelif t.startswith('◎产 地'):name = pares_info(t,'◎产 地')moveInfo['movie_place']=nameelif t.startswith('◎类 别'):name = pares_info(t,'◎类 别')moveInfo['category']=nameelif t.startswith('◎语 言'):name = pares_info(t,'◎语 言')moveInfo['language']=nameelif t.startswith('◎字 幕'):name = pares_info(t,'◎字 幕')moveInfo['subtitle']=nameelif t.startswith('◎上映日期'):name = pares_info(t,'◎上映日期')moveInfo['release_date']=nameelif t.startswith('◎豆瓣评分'):name = pares_info(t,'◎豆瓣评分')moveInfo['douban_score']=nameelif t.startswith('◎片 长'):name = pares_info(t,'◎片 长')moveInfo['file_length']=nameelif t.startswith('◎导 演'):name = pares_info(t,'◎导 演')moveInfo['director']=nameelif t.startswith('◎编 剧'):name = pares_info(t, '◎编 剧')writers = [name]for i in range(index + 1, len(mContnent)):writer = mContnent[i].strip()if writer.startswith('◎'):breakwriters.append(writer)moveInfo['screenwriter'] = writerselif t.startswith('◎主 演'):name = pares_info(t, '◎主 演')actors = [name]for i in range(index+1,len(mContnent)):actor = mContnent[i].strip()if actor.startswith('◎'):breakactors.append(actor)moveInfo['stars'] = " ".join(actors)elif t.startswith('◎标 签'):name = pares_info(t,'◎标 签')moveInfo['tags']=nameelif t.startswith('◎简 介'):name = pares_info(t,'◎简 介')profiles = []for i in range(index + 1, len(mContnent)):profile = mContnent[i].strip()if profile.startswith('◎获奖情况') or '【下载地址】' in profile:breakprofiles.append(profile)moveInfo['introduction']=" ".join(profiles)elif t.startswith('◎获奖情况'):name = pares_info(t,'◎获奖情况')awards = []for i in range(index + 1, len(mContnent)):award = mContnent[i].strip()if '【下载地址】' in award:breakawards.append(award)moveInfo['awards']=" ".join(awards)moveInfo['movie_url'] = urlreturn moveInfo# 获取前n页所有电影的详情页href
def spider():#连接数据库base_url = 'https://www.dy2018.com/html/gndy/dyzz/index_{}.html'moves = []m = int(input('请输入您要获取的开始页:'))n = int(input('请输入您要获取的结束页:'))print('即将写入第{}页到第{}页的电影信息,请稍后...'.format(m, n))for i in range(m,n+1):print('******* 第{}页电影 正在写入 ********'.format(i))if i == 1:url = "https://www.dy2018.com/html/gndy/dyzz/"else:url = base_url.format(i)moveHref = getHref(url)print("休息2s后再进行操作")time.sleep(2)for index,mhref in enumerate(moveHref):print('---- 正在处理第{}部电影----'.format(index+1))move = getPage(mhref)moves.append(move)
# 将电影信息写入数据库db = pymysql.connect(host='127.0.0.1',user='root', password='123456', port=3306, db='你的数据库名称')table = 'movies'i = 1for data in moves:keys = ', '.join(data.keys())values = ', '.join(['%s'] * len(data))sql = 'INSERT INTO {table}(id,{keys}) VALUES (null,{values})'.format(table=table, keys=keys, values=values)try:cursor = db.cursor()cursor.execute(sql, tuple(data.values()))print('本条数据成功执行!')if i%10==0:db.commit()except Exception as e:print('将电影信息写入数据库发生异常!',repr(e))db.rollback()cursor.close()i = i + 1db.commit()db.close()print('写入数据库完成!')if __name__ == '__main__':spider()
三.运行测试
1.新建电影信息表
CREATE TABLE `movies` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`movie_name` varchar(255) DEFAULT NULL,`image_path` varchar(255) DEFAULT NULL,`screenshot` varchar(255) DEFAULT NULL,`translation` varchar(255) DEFAULT NULL,`movie_title` varchar(255) DEFAULT NULL,`movie_age` varchar(50) DEFAULT NULL,`movie_place` varchar(50) DEFAULT NULL,`category` varchar(100) DEFAULT NULL,`language` varchar(100) DEFAULT NULL,`subtitle` varchar(100) DEFAULT NULL,`release_date` varchar(50) DEFAULT NULL,`douban_score` varchar(50) DEFAULT NULL,`file_length` varchar(255) DEFAULT NULL,`director` varchar(100) DEFAULT NULL,`screenwriter` varchar(100) DEFAULT NULL,`stars` mediumtext,`tags` varchar(255) DEFAULT NULL,`introduction` mediumtext,`awards` text,`movie_url` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.代码运行
打开 collectMovies.py 所在目录,输入命令运行:
python collectMovies.py
运行结果如下:
查看数据库表,数据已成功插入:
四.问题排查和修复
1.空白字符报错
第一次使用 Python,不太熟悉它的规则,空格和Tab混用,运行会报如下错:
unindent does not match any outer indentation level
解决方法
下载 Notepad++,选择 “编辑” – “空白字符操作” – "空格转 Tab (行首)"即可。
2.请求报错
修改好格式之后再次运行,反反复复的报请求的错,报错信息主要包括以下内容:
ssl.SSLEOFError: EOF occurred in violation of protocol
······
Max retries exceeded with url
解决方法
本来以为是请求设置出了问题,各种百度,还安装了 pip install incremental
,但是依然没有奏效。
后来把请求的网址换成百度网就不报错了,这样可以定位到是原网址的访问出了问题,更换了采集源路径,该问题解决。
Python 爬虫实现:抓取电影网站信息并入库相关推荐
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
- 用php实现一个简单的爬虫,抓取电影网站的视频下载地址
昨天没什么事,先看一下电影,就用php写了一个爬虫在视频网站上进行视频下载地址的抓取,这里总结一下抓取过程中遇到的问题 1:通过访问浏览器来执行php脚本这种访问方式其实并不适合用来爬网页,因为要受到 ...
- Python爬虫之抓取京东店铺信息及下载图片
这个是抓取信息的 from bs4 import BeautifulSoup import requestsurl = 'https://list.tmall.com/search_product.h ...
- python爬取网店数据_Python爬虫实现抓取京东店铺信息及下载图片功能示例
本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requ ...
- python简单爬虫代码-python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息...
原标题:python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息 最近经常有人问我,明明看着教程写个爬虫很简单,但是自己上手的时候就麻爪了...那么今天就给刚开始学习爬虫的同学,分享一下怎么一步 ...
- Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)
Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...
- python抓取视频违法吗,科学网—【python爬虫】抓取B站视频相关信息(一) - 管金昱的博文...
昨天我在B站上写了这么一篇文章,但是被他们锁住了.无奈之下我复制到知乎上先保存起来 在这篇名为<三天学会用python进行简单地爬取B站网页视频数据>文章中我主要提到了两点在已知aid的情 ...
- Python爬虫采集抓取:Python3.x+Fiddler 采集抓取 APP 数据
随着移动互联网的市场份额逐步扩大,手机 APP 已经占据我们的生活,以往的数据分析都借助于爬虫采集爬取网页数据进行分析,但是新兴的产品有的只有 APP,并没有网页端这对于想要提取数据的我们就遇到了些问 ...
- Python爬虫:抓取智联招聘岗位信息和要求(进阶版)
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:王强 ( 想要学习Python?Python学习交流群 ...
最新文章
- 关于操作日志表的设计问题
- 【KVM系列02】KVM的CPU 和内存虚拟化
- php 任意字符串_php 生成任意长度字符串的类(只含有数字 只含有字母 混合数字和字母)...
- python正则中如何匹配汉字以及encode(‘utf-8’)和decode(‘utf-8’)的互转
- 橱窗布置(信息学奥赛一本通-T1279)
- 信阳农林技术学院经纬度_信阳农林学院驻村工作队为扶贫村协调种苗助力美丽乡村建设...
- iOS 关于NSString的一些方法
- 人工智能重点汇总(搜索策略、博弈、贝叶斯、SVM、神经网络、弧相容、SVM、决策树、反向传播、卷积神经网络)
- 视频教程-Excel函数教程(下)-Office/WPS
- 《穿越计算机的迷雾》读书笔记
- 风云武魂传说防御(四职业)
- 解决github上的提交说明中文乱码的问题
- G16C如何切换语言,怎样使用 WinCC (TIA 博途) 实现在 SIMATIC HMI 面板中语言切换功能?...
- css修改图标字体大小,css-更改AngularJS材质图标的图标大小
- 动态MAC地址和静态MAC地址
- 电子类通信类和计算机类ei期刊,电子类通信类和计算机类EI期刊(大部分免费)
- 苏州大学在职研究生计算机专业,苏州大学在职研究生入学须知
- 热爱生活阳光自信才能让自己快乐
- html和css实现透明div上的div不透明,也可说父div透明,子div不透明
- Ubuntu 命令行下浏览网页