网络编程
位置:首页>> 网络编程>> Python编程>> Python爬虫实现抓取电影网站信息并入库

Python爬虫实现抓取电影网站信息并入库

作者:盛夏温暖流年  发布时间:2023-12-25 02:42:32 

标签:Python,爬虫,网站,信息

一.环境搭建

1.下载安装包

访问 Python官网下载地址:https://www.python.org/downloads/

下载适合自己系统的安装包:

Python爬虫实现抓取电影网站信息并入库

我用的是 Windows 环境,所以直接下的 exe 包进行安装。

下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。

2.修改环境变量

Python爬虫实现抓取电影网站信息并入库

右键点击"计算机",点击"属性";

然后点击"高级系统设置"-“环境变量”;

选择"系统变量"窗口下面的 “Path” ,添加 python 安装路径;

设置成功以后,在cmd命令行,输入命令"python",有显示则说明配置成功。

3.安装依赖模块

我们的爬取程序需要安装的依赖模块包括 requests,lxml,pymysql ,步骤如下:

进入python安装目录下的Scripts目录,点击地址栏输入“cmd” 打开命令行工具:

Python爬虫实现抓取电影网站信息并入库

在这个路径下安装对应的 requests,lxml,pymysql 依赖:

Python爬虫实现抓取电影网站信息并入库

需要输入的命令:

// 安装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.text
html = etree.HTML(urlText)  # 使用lxml解析网页
s.keep_alive = False
return 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_DOMAIN
return htmlAll

# 使用content解析电影详情页,并获取详细信息数据
def getPage(url):
html = getUrlText(url,'c')
moveInfo = {}  # 定义电影信息
mName = html.xpath('//div[@class="title_all"]//h1/text()')[0]
moveInfo['movie_name'] = mName
mDiv = 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']=name
elif t.startswith('◎片名'):
name = pares_info(t,'◎片名')
moveInfo['movie_title']=name
elif t.startswith('◎年代'):
name = pares_info(t,'◎年代')
moveInfo['movie_age']=name
elif t.startswith('◎产地'):
name = pares_info(t,'◎产地')
moveInfo['movie_place']=name
elif t.startswith('◎类别'):
name = pares_info(t,'◎类别')
moveInfo['category']=name
elif t.startswith('◎语言'):
name = pares_info(t,'◎语言')
moveInfo['language']=name
elif t.startswith('◎字幕'):
name = pares_info(t,'◎字幕')
moveInfo['subtitle']=name
elif t.startswith('◎上映日期'):
name = pares_info(t,'◎上映日期')
moveInfo['release_date']=name
elif t.startswith('◎豆瓣评分'):
name = pares_info(t,'◎豆瓣评分')
moveInfo['douban_score']=name
elif t.startswith('◎片长'):
name = pares_info(t,'◎片长')
moveInfo['file_length']=name
elif t.startswith('◎导演'):
name = pares_info(t,'◎导演')
moveInfo['director']=name
elif t.startswith('◎编剧'):
name = pares_info(t, '◎编剧')
writers = [name]
for i in range(index + 1, len(mContnent)):
writer = mContnent[i].strip()
if writer.startswith('◎'):
break
writers.append(writer)
moveInfo['screenwriter'] = writers
elif t.startswith('◎主演'):
name = pares_info(t, '◎主演')
actors = [name]
for i in range(index+1,len(mContnent)):
actor = mContnent[i].strip()
if actor.startswith('◎'):
break
actors.append(actor)
moveInfo['stars'] = " ".join(actors)
elif t.startswith('◎标签'):
name = pares_info(t,'◎标签')
moveInfo['tags']=name
elif 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:
break
profiles.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:
break
awards.append(award)
moveInfo['awards']=" ".join(awards)
moveInfo['movie_url'] = url
return 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 = 1
for 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 + 1
db.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

运行结果如下:

Python爬虫实现抓取电影网站信息并入库

Python爬虫实现抓取电影网站信息并入库

查看数据库表,数据已成功插入:

Python爬虫实现抓取电影网站信息并入库

四.问题排查和修复

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 ,但是依然没有奏效。

后来把请求的网址换成百度网就不报错了,这样可以定位到是原网址的访问出了问题,更换了采集源路径,该问题解决。

来源:https://blog.csdn.net/j1231230/article/details/108731170

0
投稿

猜你喜欢

  • 第一种方法: 代码如下:Minimsdn.com为您提供的代码: -- Turn ON [Display IO Info when exec
  • 但凡设计师都对简洁的设计情有独钟,我们不喜欢复杂,却也不能不会rich。先来看下“rich”在字典里的意思:(1) having an ab
  • 看了cragle的《有没有必要将网站Div+Css重构?》的文章,有一些想法不说不快,我也在文章的评论里提到曾经开除过两个执着使用div技术
  • CSS处理斜角导航条的一个例子,这个是写着测试用的。暂没有实际的应用。斜角处理比较麻烦,主要有两个地方。1、图片处理。2、负数的理解。这两个
  • 淘宝商城的 detail 页面“产品详情”部分是商家自定义区块,曾出现这样一个问题:推荐:css行高:line-height属性详解 <
  • 在家无聊,线代和高数看不懂,整点事情干,就准备预定回学校的高铁票,于是就有了这个文章准备工作1.pip安装chromediver,当然也可以
  • 在前面的DRF系列教程中,我们以博客为例介绍了序列化器, 使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删
  • 假如您在安装SQL Server 2005时出现计数器错误,在搜索过所有的方法都不适用的情况下可以采用以下方法:将4个计数器删除:(如果没有
  • 平时在PL/SQL中的编程中遇到一些问题,这里以问答的形式来进行把它们总结下来,以供大家分享。1、当需要向表中装载大量的数据流或者需要处理大
  •  Python中的单元测试我们先来回顾一下Python中的单元测试方法。下面是一个 Python的单元测试简单的例子:假如我们开发
  • pip的安装,以及使用pip安装包的方法,记录如下,分享给大家:—–安装python的时候勾选了下载pip,不知道为什么没下载。然后就偷懒想
  • 最近因项目需要用ACCESS做数据库开发WEB项目看论坛上还许多人问及ACCESS被注入的安全问题许多人解决的方法仍然是用Replace替换
  • 1)按笔画排序select * from Table order by nlssort(columnName,'NLS_SORT=S
  • 这样处理的弊端是:如果数据量大,子分类很多,达到4级以上,这方法处理极端占用数据库连接池 对性能影响很大。 如果用SQL下面的CTE递归处理
  • 在所有的比例中黄金分割是最能引起人的美感的,0.618被公认为最具有审美意义的比例数字。黄金分割之所以那么普遍的流行,我猜一定跟理想女人体的
  • 为了庆祝jQuery的四周岁生日, jQuery的团队荣幸的发布了jQuery Javascript库的最新主要版本! 这个版本包含了大量的
  • 对于中小型个人、企业网站来说,MySQL数据库或许是目前数据库的最完美实施解决方案了。在不变更服务器硬件的前提下,一个经过良好架构,优化后的
  • CSS 3 + HTML 5 是未来的 Web,它们都还没有正式到来,虽然不少浏览器已经开始对它们提供部分支持。本文介绍了 5 个 CSS3
  • 修改MySQL下的默认mysql数据库的user表,删除所有host为localhost记录,另外添加一些其他记录,重新启动MySQL服务器
  • 用户体验(User Experience,简称UE)是用户在使用产品过程中建立起来的一种纯主观感受。在基于Web的产品设计中,UE是一个相对
手机版 网络编程 asp之家 www.aspxhome.com