欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python爬蟲(chóng)實(shí)現(xiàn)抓取電影網(wǎng)站信息并入庫(kù)

 更新時(shí)間:2022年02月16日 10:19:09   作者:盛夏溫暖流年  
本文主要介紹了利用Python爬蟲(chóng)實(shí)現(xiàn)抓取電影網(wǎng)站信息的功能,并將抓取到的信息入庫(kù)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下

一.環(huán)境搭建

1.下載安裝包

訪問(wèn) Python官網(wǎng)下載地址:https://www.python.org/downloads/

下載適合自己系統(tǒng)的安裝包:

我用的是 Windows 環(huán)境,所以直接下的 exe 包進(jìn)行安裝。

下載后,雙擊下載包,進(jìn)入 Python 安裝向?qū)В惭b非常簡(jiǎn)單,你只需要使用默認(rèn)的設(shè)置一直點(diǎn)擊"下一步"直到安裝完成即可。

2.修改環(huán)境變量

右鍵點(diǎn)擊"計(jì)算機(jī)",點(diǎn)擊"屬性";

然后點(diǎn)擊"高級(jí)系統(tǒng)設(shè)置"-“環(huán)境變量”;

選擇"系統(tǒng)變量"窗口下面的 “Path” ,添加 python 安裝路徑;

設(shè)置成功以后,在cmd命令行,輸入命令"python",有顯示則說(shuō)明配置成功。

3.安裝依賴模塊

我們的爬取程序需要安裝的依賴模塊包括 requests,lxml,pymysql ,步驟如下:

進(jìn)入python安裝目錄下的Scripts目錄,點(diǎn)擊地址欄輸入“cmd” 打開(kāi)命令行工具:

在這個(gè)路徑下安裝對(duì)應(yīng)的 requests,lxml,pymysql 依賴:

需要輸入的命令:

// 安裝requests依賴
pip install requests

// 安裝lxml依賴
pip install lxml

// 安裝pymysql依賴
pip install pymysql

二.代碼開(kāi)發(fā)

開(kāi)發(fā) collectMovies.py

#!/user/bin env python
# 獲取電影天堂詳細(xì)信息
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/'
# 獲取首頁(yè)網(wǎng)頁(yè)信息并解析
def getUrlText(url,coding):
	s = requests.session()
	#print("獲取首頁(yè)網(wǎng)頁(yè)信息并解析:", url)
	respons = s.get(url,headers=HEADERS)
	print("請(qǐng)求URL:", url)
	if(coding=='c'):
		urlText = respons.content.decode('gbk')
		html = etree.HTML(urlText)  # 使用lxml解析網(wǎng)頁(yè)
	else:
		urlText = respons.text
		html = etree.HTML(urlText)  # 使用lxml解析網(wǎng)頁(yè)
	s.keep_alive = False
	return html

# 獲取電影詳情頁(yè)的href,text解析
def getHref(url):
	html = getUrlText(url,'t')
	aHref = html.xpath('//table[@class="tbspan"]//a/@href')
	print("獲取電影詳情頁(yè)的href,text解析```")
	htmlAll = map(lambda url:BASE_DOMAIN+url,aHref) # 給每個(gè)href補(bǔ)充BASE_DOMAIN
	return htmlAll

# 使用content解析電影詳情頁(yè),并獲取詳細(xì)信息數(shù)據(jù)
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]  # 獲取海報(bào)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('◎產(chǎn)  地'):
			name = pares_info(t,'◎產(chǎn)  地')
			moveInfo['movie_place']=name
		elif t.startswith('◎類  別'):
			name = pares_info(t,'◎類  別')
			moveInfo['category']=name
		elif t.startswith('◎語(yǔ)  言'):
			name = pares_info(t,'◎語(yǔ)  言')
			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('◎豆瓣評(píng)分'):
			name = pares_info(t,'◎豆瓣評(píng)分')
			moveInfo['douban_score']=name
		elif t.startswith('◎片  長(zhǎng)'):
			name = pares_info(t,'◎片  長(zhǎng)')
			moveInfo['file_length']=name
		elif t.startswith('◎?qū)А ⊙?):
			name = pares_info(t,'◎?qū)А ⊙?)
			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('◎標(biāo)  簽'):
			name = pares_info(t,'◎標(biāo)  簽')
			moveInfo['tags']=name
		elif t.startswith('◎簡(jiǎn)  介'):
			name = pares_info(t,'◎簡(jiǎn)  介')
			profiles = []
			for i in range(index + 1, len(mContnent)):
				profile = mContnent[i].strip()
				if profile.startswith('◎獲獎(jiǎng)情況') or '【下載地址】' in profile:
					break
				profiles.append(profile)
			moveInfo['introduction']=" ".join(profiles)
		elif t.startswith('◎獲獎(jiǎng)情況'):
			name = pares_info(t,'◎獲獎(jiǎng)情況')
			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頁(yè)所有電影的詳情頁(yè)href
def spider():
	#連接數(shù)據(jù)庫(kù)
	base_url = 'https://www.dy2018.com/html/gndy/dyzz/index_{}.html'
	moves = []
	m = int(input('請(qǐng)輸入您要獲取的開(kāi)始頁(yè):'))
	n = int(input('請(qǐng)輸入您要獲取的結(jié)束頁(yè):'))
	print('即將寫(xiě)入第{}頁(yè)到第{}頁(yè)的電影信息,請(qǐng)稍后...'.format(m, n))
	for i in range(m,n+1):
		print('******* 第{}頁(yè)電影 正在寫(xiě)入 ********'.format(i))
		if i == 1:
			url = "https://www.dy2018.com/html/gndy/dyzz/"
		else:
			url = base_url.format(i)
		moveHref = getHref(url)
		print("休息2s后再進(jìn)行操作")
		time.sleep(2)
		for index,mhref in enumerate(moveHref):
			print('---- 正在處理第{}部電影----'.format(index+1))
			move = getPage(mhref)
			moves.append(move)
# 將電影信息寫(xiě)入數(shù)據(jù)庫(kù)
	db = pymysql.connect(host='127.0.0.1',user='root', password='123456', port=3306, db='你的數(shù)據(jù)庫(kù)名稱')
	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('本條數(shù)據(jù)成功執(zhí)行!')
			if i%10==0:
   				db.commit()
		except Exception as e:
   			print('將電影信息寫(xiě)入數(shù)據(jù)庫(kù)發(fā)生異常!',repr(e))
   			db.rollback()
		cursor.close()
		i = i + 1
	db.commit()
	db.close()
	print('寫(xiě)入數(shù)據(jù)庫(kù)完成!')

if __name__ == '__main__':
	spider()

三.運(yùn)行測(cè)試

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.代碼運(yùn)行

打開(kāi) collectMovies.py 所在目錄,輸入命令運(yùn)行:

python collectMovies.py

運(yùn)行結(jié)果如下:

查看數(shù)據(jù)庫(kù)表,數(shù)據(jù)已成功插入:

四.問(wèn)題排查和修復(fù)

1.空白字符報(bào)錯(cuò)

第一次使用 Python,不太熟悉它的規(guī)則,空格和Tab混用,運(yùn)行會(huì)報(bào)如下錯(cuò):

unindent does not match any outer indentation level

解決方法

下載 Notepad++,選擇 “編輯” – “空白字符操作” – "空格轉(zhuǎn) Tab (行首)"即可。

2.請(qǐng)求報(bào)錯(cuò)

修改好格式之后再次運(yùn)行,反反復(fù)復(fù)的報(bào)請(qǐng)求的錯(cuò),報(bào)錯(cuò)信息主要包括以下內(nèi)容:

ssl.SSLEOFError: EOF occurred in violation of protocol
······
Max retries exceeded with url

解決方法

本來(lái)以為是請(qǐng)求設(shè)置出了問(wèn)題,各種百度,還安裝了 pip install incremental ,但是依然沒(méi)有奏效。

后來(lái)把請(qǐng)求的網(wǎng)址換成百度網(wǎng)就不報(bào)錯(cuò)了,這樣可以定位到是原網(wǎng)址的訪問(wèn)出了問(wèn)題,更換了采集源路徑,該問(wèn)題解決。

以上就是Python爬蟲(chóng)實(shí)現(xiàn)抓取電影網(wǎng)站信息并入庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于Python抓取網(wǎng)站信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 同時(shí)安裝Python2 & Python3 cmd下版本自由選擇的方法

    同時(shí)安裝Python2 & Python3 cmd下版本自由選擇的方法

    下面小編就為大家分享一篇同時(shí)安裝Python2 & Python3 cmd下版本自由選擇的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解

    人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解

    這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • Python中的代碼異常處理你掌握了嗎

    Python中的代碼異常處理你掌握了嗎

    Python?使用稱為異常(exception)的特殊對(duì)象來(lái)管理程序執(zhí)行期間發(fā)生的錯(cuò)誤,那Python中代碼異常處理的相關(guān)操作你都了解了嗎,本文為大家進(jìn)行了詳細(xì)整理,需要的可以參考下
    2023-06-06
  • tensorboard 可以顯示graph,卻不能顯示scalar的解決方式

    tensorboard 可以顯示graph,卻不能顯示scalar的解決方式

    今天小編就為大家分享一篇tensorboard 可以顯示graph,卻不能顯示scalar的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 用Python寫(xiě)一個(gè)無(wú)界面的2048小游戲

    用Python寫(xiě)一個(gè)無(wú)界面的2048小游戲

    這篇文章主要介紹了用Python寫(xiě)一個(gè)無(wú)界面的2048小游戲的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • 使用Python進(jìn)行同期群分析(Cohort?Analysis)

    使用Python進(jìn)行同期群分析(Cohort?Analysis)

    同期群(Cohort)的字面意思(有共同特點(diǎn)或舉止類同的)一群人,比如不同性別,不同年齡。這篇文章主要介紹了用Python語(yǔ)言來(lái)進(jìn)行同期群分析,感興趣的同學(xué)可以閱讀參考一下本文
    2023-03-03
  • Python中的通函數(shù)numpy.ufunc詳解

    Python中的通函數(shù)numpy.ufunc詳解

    這篇文章主要介紹了什么是通函數(shù)numpy.ufunc,簡(jiǎn)單說(shuō)就是numpy的函數(shù),因?yàn)閚umpy針對(duì)的是數(shù)組張量,因此,幾乎每一個(gè)函數(shù)都是ufunc。本文針對(duì)ufunc的屬性進(jìn)行研究,需要的朋友可以參考下
    2023-04-04
  • pyqt5 QProgressBar清空進(jìn)度條的實(shí)例

    pyqt5 QProgressBar清空進(jìn)度條的實(shí)例

    今天小編就為大家分享一篇pyqt5 QProgressBar清空進(jìn)度條的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 以一個(gè)投票程序的實(shí)例來(lái)講解Python的Django框架使用

    以一個(gè)投票程序的實(shí)例來(lái)講解Python的Django框架使用

    這篇文章主要介紹了以一個(gè)投票程序的實(shí)例來(lái)講解Python的Django框架使用,Django是Python世界中人氣最高的MVC框架,需要的朋友可以參考下
    2016-02-02
  • python字符串的index和find的區(qū)別詳解

    python字符串的index和find的區(qū)別詳解

    這篇文章主要介紹了python字符串的index和find的區(qū)別,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論