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.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抓取网站信息的资料请关注我们其它相关文章!

(0)

相关推荐

  • 用Python爬取2022春节档电影信息

    目录 前提条件 相关介绍 实验环境 具体步骤 目标网站 分析网站 代码实现 输出结果 总结 前提条件 熟悉HTML基础语句 熟悉Xpath基础语句 相关介绍 Python是一种跨平台的计算机程序设计语言.是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发.Requests是一个很实用的Python HTTP客户端库.Pandas是一个Python软件包,提供快速,灵活和

  • Python猫眼电影最近上映的电影票房信息

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 基本环境配置 python 3.6 pycharm requests csv 相关模块pip安装即可 目标网站 数据接口 请求网页获取数据 import requests url = 'http://piaofang.maoyan.com/dashboard-ajax/movie' params = { } cookie

  • 用python爬取租房网站信息的代码

    自己在刚学习python时写的,中途遇到很多问题,查了很多资料,下面就是我爬取租房信息的代码: 链家的房租网站 两个导入的包 1.requests 用来过去网页内容 2.BeautifulSoup import time import pymssql import requests from bs4 import BeautifulSoup # https://wh.lianjia.com/zufang/ #获取url中下面的内容 def get_page(url): responce = re

  • Python实现的爬取豆瓣电影信息功能案例

    本文实例讲述了Python实现的爬取豆瓣电影信息功能.分享给大家供大家参考,具体如下: 本案例的任务为,爬取豆瓣电影top250的电影信息(包括序号.电影名称.导演和主演.评分以及经典台词),并将信息作为字典形式保存进txt文件.这里只用到requests库,没有用到beautifulsoup库 step1:首先获取每一页的源代码,用requests.get函数获取,为了防止请求错误,使用try...except.. def getpage(url): try: res=requests.get

  • Python基于requests库爬取网站信息

    requests库是一个简介且简单的处理HTTP请求的第三方库 get()是获取网页最常用的方式,其基本使用方式如下 使用requests库获取HTML页面并将其转换成字符串后,需要进一步解析HTML页面格式,这里我们常用的就是beautifulsoup4库,用于解析和处理HTML和XML 下面这段代码便是爬取百度的信息并简单输出百度的界面信息 import requests from bs4 import BeautifulSoup r=requests.get('http://www.bai

  • Python抓取电影天堂电影信息的代码

    Python2.7Mac OS 抓取的是电影天堂里面最新电影的页面.链接地址: http://www.dytt8.net/html/gndy/dyzz/index.html 获取页面的中电影详情页链接 import urllib2 import os import re import string # 电影URL集合 movieUrls = [] # 获取电影列表 def queryMovieList(): url = 'http://www.dytt8.net/html/gndy/dyzz/i

  • Python爬取爱奇艺电影信息代码实例

    这篇文章主要介绍了Python爬取爱奇艺电影信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,使用库 1.requests 2.re 3.json 二,抓取html文件 def get_page(url): response = requests.get(url) if response.status_code == 200: return response.text return None 三,解析html文件 我们需要的电影信

  • 用python爬取中国大学排名网站排名信息

    程序解决问题如下: 利用python网络爬虫爬取中国大学排名网站上的排名信息,将排名前20的大学的信息保存为文本文件,并在窗口打印出这20所大学的信息,按列打印和保存. 程序代码如下: import requests from bs4 import BeautifulSoup import bs4 def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = r.app

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

    目录 一.环境搭建 1.下载安装包 2.修改环境变量 3.安装依赖模块 二.代码开发 三.运行测试 1.新建电影信息表 2.代码运行 四.问题排查和修复 1.空白字符报错 2.请求报错 一.环境搭建 1.下载安装包 访问 Python官网下载地址:https://www.python.org/downloads/ 下载适合自己系统的安装包: 我用的是 Windows 环境,所以直接下的 exe 包进行安装. 下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一

  • Python爬虫实现抓取京东店铺信息及下载图片功能示例

    本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requests url = 'https://list.tmall.com/search_product.htm?q=%CB%AE%BA%F8+%C9%D5%CB%AE&type=p&vmarket=&spm=875.7931836%2FA.a2227oh.d100&from=mal

  • Python多进程方式抓取基金网站内容的方法分析

    本文实例讲述了Python多进程方式抓取基金网站内容的方法.分享给大家供大家参考,具体如下: 在前面这篇//www.jb51.net/article/162418.htm我们已经简单了解了"python的多进程",现在我们需要把抓取基金网站(28页)内容写成多进程的方式. 因为进程也不是越多越好,我们计划分3个进程执行.意思就是 :把总共要抓取的28页分成三部分. 怎么分呢? # 初始range r = range(1,29) # 步长 step = 10 myList = [r[x:

  • python爬虫实现爬取同一个网站的多页数据的实例讲解

    对于一个网站的图片.文字音视频等,如果我们一个个的下载,不仅浪费时间,而且很容易出错.Python爬虫帮助我们获取需要的数据,这个数据是可以快速批量的获取.本文小编带领大家通过python爬虫获取获取总页数并更改url的方法,实现爬取同一个网站的多页数据. 一.爬虫的目的 从网上获取对你有需要的数据 二.爬虫过程 1.获取url(网址). 2.发出请求,获得响应. 3.提取数据. 4.保存数据. 三.爬虫功能 可以快速批量的获取想要的数据,不用手动的一个个下载(图片.文字音视频等) 四.使用py

  • Java爬虫实战抓取一个网站上的全部链接

    前言:写这篇文章之前,主要是我看了几篇类似的爬虫写法,有的是用的队列来写,感觉不是很直观,还有的只有一个请求然后进行页面解析,根本就没有自动爬起来这也叫爬虫?因此我结合自己的思路写了一下简单的爬虫. 一 算法简介 程序在思路上采用了广度优先算法,对未遍历过的链接逐次发起GET请求,然后对返回来的页面用正则表达式进行解析,取出其中未被发现的新链接,加入集合中,待下一次循环时遍历. 具体实现上使用了Map<String, Boolean>,键值对分别是链接和是否被遍历标志.程序中使用了两个Map集

  • 零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版

    百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都是通过查看源码扣出关键数据,然后将其存储到本地txt文件. 项目内容: 用Python写的百度贴吧的网络爬虫. 使用方法: 新建一个BugBaidu.py文件,然后将代码复制到里面后,双击运行. 程序功能: 将贴吧中楼主发布的内容打包txt存储到本地. 原理解释: 首先,先浏览一下某一条贴吧,点击只看楼主并点击第二页之后url发生了一点变化,变成了: http://tieba.baidu.com/p/2296712428?see_lz=1&pn=

  • 零基础写python爬虫之抓取百度贴吧代码分享

    这里就不给大家废话了,直接上代码,代码的解释都在注释里面,看不懂的也别来问我,好好学学基础知识去! 复制代码 代码如下: # -*- coding: utf-8 -*- #--------------------------------------- #   程序:百度贴吧爬虫 #   版本:0.1 #   作者:why #   日期:2013-05-14 #   语言:Python 2.7 #   操作:输入带分页的地址,去掉最后面的数字,设置一下起始页数和终点页数. #   功能:下载对应页

  • 零基础写python爬虫之抓取糗事百科代码分享

    项目内容: 用Python写的糗事百科的网络爬虫. 使用方法: 新建一个Bug.py文件,然后将代码复制到里面后,双击运行. 程序功能: 在命令提示行中浏览糗事百科. 原理解释: 首先,先浏览一下糗事百科的主页:http://www.qiushibaike.com/hot/page/1 可以看出来,链接中page/后面的数字就是对应的页码,记住这一点为以后的编写做准备. 然后,右击查看页面源码: 观察发现,每一个段子都用div标记,其中class必为content,title是发帖时间,我们只需

  • Python使用scrapy抓取网站sitemap信息的方法

    本文实例讲述了Python使用scrapy抓取网站sitemap信息的方法.分享给大家供大家参考.具体如下: import re from scrapy.spider import BaseSpider from scrapy import log from scrapy.utils.response import body_or_str from scrapy.http import Request from scrapy.selector import HtmlXPathSelector c

随机推荐