文章目录

  • 一.环境搭建
    • 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 爬虫实现:抓取电影网站信息并入库相关推荐

  1. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  2. 用php实现一个简单的爬虫,抓取电影网站的视频下载地址

    昨天没什么事,先看一下电影,就用php写了一个爬虫在视频网站上进行视频下载地址的抓取,这里总结一下抓取过程中遇到的问题 1:通过访问浏览器来执行php脚本这种访问方式其实并不适合用来爬网页,因为要受到 ...

  3. Python爬虫之抓取京东店铺信息及下载图片

    这个是抓取信息的 from bs4 import BeautifulSoup import requestsurl = 'https://list.tmall.com/search_product.h ...

  4. python爬取网店数据_Python爬虫实现抓取京东店铺信息及下载图片功能示例

    本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requ ...

  5. python简单爬虫代码-python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息...

    原标题:python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息 最近经常有人问我,明明看着教程写个爬虫很简单,但是自己上手的时候就麻爪了...那么今天就给刚开始学习爬虫的同学,分享一下怎么一步 ...

  6. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  7. python抓取视频违法吗,科学网—【python爬虫】抓取B站视频相关信息(一) - 管金昱的博文...

    昨天我在B站上写了这么一篇文章,但是被他们锁住了.无奈之下我复制到知乎上先保存起来 在这篇名为<三天学会用python进行简单地爬取B站网页视频数据>文章中我主要提到了两点在已知aid的情 ...

  8. Python爬虫采集抓取:Python3.x+Fiddler 采集抓取 APP 数据

    随着移动互联网的市场份额逐步扩大,手机 APP 已经占据我们的生活,以往的数据分析都借助于爬虫采集爬取网页数据进行分析,但是新兴的产品有的只有 APP,并没有网页端这对于想要提取数据的我们就遇到了些问 ...

  9. Python爬虫:抓取智联招聘岗位信息和要求(进阶版)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:王强 ( 想要学习Python?Python学习交流群 ...

最新文章

  1. 关于操作日志表的设计问题
  2. 【KVM系列02】KVM的CPU 和内存虚拟化
  3. php 任意字符串_php 生成任意长度字符串的类(只含有数字 只含有字母 混合数字和字母)...
  4. python正则中如何匹配汉字以及encode(‘utf-8’)和decode(‘utf-8’)的互转
  5. 橱窗布置(信息学奥赛一本通-T1279)
  6. 信阳农林技术学院经纬度_信阳农林学院驻村工作队为扶贫村协调种苗助力美丽乡村建设...
  7. iOS 关于NSString的一些方法
  8. 人工智能重点汇总(搜索策略、博弈、贝叶斯、SVM、神经网络、弧相容、SVM、决策树、反向传播、卷积神经网络)
  9. 视频教程-Excel函数教程(下)-Office/WPS
  10. 《穿越计算机的迷雾》读书笔记
  11. 风云武魂传说防御(四职业)
  12. 解决github上的提交说明中文乱码的问题
  13. G16C如何切换语言,怎样使用 WinCC (TIA 博途) 实现在 SIMATIC HMI 面板中语言切换功能?...
  14. css修改图标字体大小,css-更改AngularJS材质图标的图标大小
  15. 动态MAC地址和静态MAC地址
  16. 电子类通信类和计算机类ei期刊,电子类通信类和计算机类EI期刊(大部分免费)
  17. 苏州大学在职研究生计算机专业,苏州大学在职研究生入学须知
  18. 热爱生活阳光自信才能让自己快乐
  19. html和css实现透明div上的div不透明,也可说父div透明,子div不透明
  20. Ubuntu 命令行下浏览网页

热门文章

  1. 蜂窝六边形消除新游戏如何获取高分
  2. 2022目前三种有效加速国内Github
  3. Java——多功能计算器的布局实现
  4. html5 自建工作流,flowable可视化工作流设计器,html5工作流设计器,vue版本工作流...
  5. pytest框架的安装与使用
  6. R语言使用options参数指定计算结果中显示的有效数字的位数
  7. windows下生成MTK手机串号
  8. Gromacs通过伞状抽样的方法计算自由能
  9. 清华计算机教授黄,北京交通大学计算机与信息技术学院研究生导师:黄惠芳
  10. 小白上楼梯(递归设计)java