一個(gè)簡(jiǎn)單的python爬蟲(chóng)程序 爬取豆瓣熱度Top100以內(nèi)的電影信息
概述
這是一個(gè)簡(jiǎn)單的python爬蟲(chóng)程序,僅用作技術(shù)學(xué)習(xí)與交流,主要是通過(guò)一個(gè)簡(jiǎn)單的實(shí)際案例來(lái)對(duì)網(wǎng)絡(luò)爬蟲(chóng)有個(gè)基礎(chǔ)的認(rèn)識(shí)。
什么是網(wǎng)絡(luò)爬蟲(chóng)
簡(jiǎn)單的講,網(wǎng)絡(luò)爬蟲(chóng)就是模擬人訪問(wèn)web站點(diǎn)的行為來(lái)獲取有價(jià)值的數(shù)據(jù)。專業(yè)的解釋:百度百科
分析爬蟲(chóng)需求
確定目標(biāo)
爬取豆瓣熱度在Top100以內(nèi)的電影的一些信息,包括電影的名稱、豆瓣評(píng)分、導(dǎo)演、編劇、主演、類型、制片國(guó)家/地區(qū)、語(yǔ)言、上映日期、片長(zhǎng)、IMDb鏈接等信息。
分析目標(biāo)
1.借助工具分析目標(biāo)網(wǎng)頁(yè)
首先,我們打開(kāi)豆瓣電影·熱門電影,會(huì)發(fā)現(xiàn)頁(yè)面總共20部電影,但當(dāng)查看頁(yè)面源代碼當(dāng)時(shí)候,在源代碼中根本找不到這些電影當(dāng)信息。這是為什么呢?原來(lái)豆瓣在這里是通過(guò)ajax技術(shù)獲取電影信息,再動(dòng)態(tài)的將數(shù)據(jù)加載到頁(yè)面中的。這就需要借助Chrome的開(kāi)發(fā)者工具,先找到獲取電影信息的API。

然后對(duì)電影詳情頁(yè)進(jìn)行分析

思路分析

具體實(shí)現(xiàn)
開(kāi)發(fā)環(huán)境
python3.6
pycharm
主要依賴庫(kù)
urllib -- 基礎(chǔ)性的網(wǎng)絡(luò)相關(guān)操作
lxml -- 通過(guò)xpath語(yǔ)法解析HTML頁(yè)面
json -- 對(duì)通過(guò)API獲取的JSON數(shù)據(jù)進(jìn)行操作
re -- 正則操作
代碼實(shí)現(xiàn)
from urllib import request
from lxml import etree
import json
import re
import ssl
# 全局取消證書(shū)驗(yàn)證
ssl._create_default_https_context = ssl._create_unverified_context
def get_headers():
"""
返回請(qǐng)求頭信息
:return:
"""
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/65.0.3325.181 Safari/537.36"
}
return headers
def get_url_content(url):
"""
獲取指定url的請(qǐng)求內(nèi)容
:param url:
:return:
"""
content = ''
headers = get_headers()
res = request.Request(url, headers=headers)
try:
resp = request.urlopen(res, timeout=10)
content = resp.read().decode('utf-8')
except Exception as e:
print('exception: %s' % e)
return content
def parse_content(content):
"""
解析網(wǎng)頁(yè)
:param content:
:return:
"""
movie = {}
html = etree.HTML(content)
try:
info = html.xpath("http://div[@id='info']")[0]
movie['director'] = info.xpath("./span[1]/span[2]/a/text()")[0]
movie['screenwriter'] = info.xpath("./span[2]/span[2]/a/text()")[0]
movie['actors'] = '/'.join(info.xpath("./span[3]/span[2]/a/text()"))
movie['type'] = '/'.join(info.xpath("./span[@property='v:genre']/"
"text()"))
movie['initialReleaseDate'] = '/'.\
join(info.xpath(".//span[@property='v:initialReleaseDate']/text()"))
movie['runtime'] = \
info.xpath(".//span[@property='v:runtime']/text()")[0]
def str_strip(s):
return s.strip()
def re_parse(key, regex):
ret = re.search(regex, content)
movie[key] = str_strip(ret[1]) if ret else ''
re_parse('region', r'<span class="pl">制片國(guó)家/地區(qū):</span>(.*?)<br/>')
re_parse('language', r'<span class="pl">語(yǔ)言:</span>(.*?)<br/>')
re_parse('imdb', r'<span class="pl">IMDb鏈接:</span> <a href="(.*?)" rel="external nofollow" '
r'target="_blank" >')
except Exception as e:
print('解析異常: %s' % e)
return movie
def spider():
"""
爬取豆瓣前100部熱門電影
:return:
"""
recommend_moives = []
movie_api = 'https://movie.douban.com/j/search_subjects?' \
'type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend' \
'&page_limit=100&page_start=0'
content = get_url_content(movie_api)
json_dict = json.loads(content)
subjects = json_dict['subjects']
for subject in subjects:
content = get_url_content(subject['url'])
movie = parse_content(content)
movie['title'] = subject['title']
movie['rate'] = subject['rate']
recommend_moives.append(movie)
print(len(recommend_moives))
print(recommend_moives)
if __name__ == '__main__':
spider()
效果
總結(jié)
本文較詳細(xì)的闡述了一個(gè)爬蟲(chóng)從需求->分析->實(shí)現(xiàn)的過(guò)程,并給出了具體的代碼實(shí)現(xiàn)。通過(guò)對(duì)本文的學(xué)習(xí),我們可以了解到網(wǎng)絡(luò)爬蟲(chóng)的一些基本的知識(shí),以及python的一些基本庫(kù)的使用方法。接下來(lái)我會(huì)使用一些高級(jí)些的網(wǎng)絡(luò)操作相關(guān)的庫(kù)以及對(duì)抓取到的數(shù)據(jù)做個(gè)存儲(chǔ)的方式,來(lái)更深層次的理解python網(wǎng)絡(luò)爬蟲(chóng)。
特別聲明
1. 本文涉及到的豆瓣網(wǎng)是國(guó)內(nèi)知名網(wǎng)站,若有侵權(quán)之處,請(qǐng)告知。
2. 本文屬作者原創(chuàng),轉(zhuǎn)載請(qǐng)標(biāo)明出處;未經(jīng)允許,不得用于商業(yè)用途。
3. 本文只是用作網(wǎng)絡(luò)爬蟲(chóng)技術(shù)學(xué)習(xí)交流,讀者涉及到的任何侵權(quán)問(wèn)題,與本文作者無(wú)關(guān)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)用技巧之如何獲取后綴名(擴(kuò)展名)或文件名
這篇文章主要介紹了在Python中獲取文件名和擴(kuò)展名的幾種方法,包括使用os.path.basename()函數(shù)獲取文件名,以及使用os.path.splitext()函數(shù)獲取文件名和擴(kuò)展名,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
Python pathlib模塊使用方法及實(shí)例解析
這篇文章主要介紹了Python pathlib模塊使用方法及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
C++和python實(shí)現(xiàn)阿姆斯特朗數(shù)字查找實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于C++和python實(shí)現(xiàn)阿姆斯特朗數(shù)字查找的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python實(shí)現(xiàn)WebP格式轉(zhuǎn)成JPG、PNG和JPEG的方法
平時(shí)在網(wǎng)上搜索圖片,另存為時(shí)常常遇到 WebP 格式,而非常見(jiàn)的 JPG、PNG、JPEG 格式,所以以此文記錄一下WebP的讀取和轉(zhuǎn)換方法,希望對(duì)大家有所幫助,需要的朋友可以參考下2024-06-06
Python中3種內(nèi)建數(shù)據(jù)結(jié)構(gòu):列表、元組和字典
這篇文章主要介紹了Python中3種內(nèi)建數(shù)據(jù)結(jié)構(gòu):列表、元組和字典,需要的朋友可以參考下2014-11-11
Python庫(kù)Gym開(kāi)發(fā)和比較強(qiáng)化學(xué)習(xí)算法使用探究
這篇文章主要介紹了Python庫(kù)Gym開(kāi)發(fā)和比較強(qiáng)化學(xué)習(xí)算法使用探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)
使用urllib2模塊進(jìn)行基于url的HTTP請(qǐng)求等操作大家也許都比較熟悉,這里我們?cè)偕钊雭?lái)了解一下urllib2針對(duì)HTTP的異常處理相關(guān)功能,一起來(lái)看一下Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié):2016-07-07
pycharm2022沒(méi)有manage repositories配置鏡像源的解決方法
本文主要介紹了pycharm2022沒(méi)有manage repositories配置鏡像源的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python實(shí)現(xiàn)的計(jì)數(shù)排序算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的計(jì)數(shù)排序算法,簡(jiǎn)單描述了計(jì)數(shù)排序的算法原理并結(jié)合具體實(shí)例形式分析了Python計(jì)數(shù)排序的相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-11-11
用Python?Tkinter庫(kù)GUI編程創(chuàng)建圖形用戶界面
這篇文章主要為大家介紹了用Python?Tkinter庫(kù)GUI編程創(chuàng)建圖形用戶界面,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

