python爬虫爬取电影,python爬取电影并下载

  python爬虫爬取电影,python爬取电影并下载

  主要介绍利用Python爬虫实现电影网站信息抓取功能,并将抓取的信息入库。文章中的示例代码有详细的解释,感兴趣的朋友可以跟随边肖了解一下。

  00-1010 1.设置环境1。下载安装包2。修改环境变量3。安装从属模块2。开发代码3。运行测试1。创建新的电影信息表2。运行代码4。故障排除和解决问题1。空白字符错误报告2。根据请求报告错误。

  

目录

  

一.环境搭建

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

  下载适合您系统的安装包:

  我用的是Windows环境,可以直接安装在exe包下。

  下载完成后,双击下载包进入Python安装向导。安装非常简单。您只需使用默认设置,然后单击“下一步”直到安装完成。

  

1.下载安装包

  右键单击“计算机”,然后单击“属性”;

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

  选择“系统变量”窗口底部的“路径”添加python安装路径;

  设置成功后,在cmd命令行上输入命令‘python’。如果显示,则配置成功。

  

2.修改环境变量

  我们的爬虫需要安装的依赖模块包括requests、lxml和pymysql。步骤如下:

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

  在以下路径中安装相应的请求、lxml和pymysql依赖项:

  必需的命令:

  //安装请求依赖项

  pip安装请求

  //安装lxml依赖项

  pip安装lxml

  //安装pymysql依赖项

  pip安装pymysql

  

3.安装依赖模块

  开发收藏电影. py

  #!/user/bin env python

  #获取关于电影天堂的详细信息

  导入请求

  导入时间

  从lxml导入etree

  导入pymysql

  requests . adapters . default _ RETRIES=5

  #伪装浏览器

  标题={

  用户代理 :Mozilla/5。(Windows NT 10.0WOW64) AppleWebKit/537.3(KHTML,像壁虎)Chrome/63 . 0 . 3239 . 13 safari/537.36 ,

  主机 :www.dy2018.com

  }

  #定义全局变量

  BASE _ DOMAIN= https://www . dy 2018.com/

  #获取主页信息并解析它

  def getUrlText(url,编码):

  s=requests.session()

  #print(获取主页信息并解析它:,url)

  respons=s.get(url,headers=HEADERS)

  打印(请求URL:,URL)

  if(coding==c):

  URL text=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

  

  运行结果如下:

  

  

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

  

  

  

四.问题排查和修复

  

  

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抓取网站信息的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: