前言:
本文非常淺顯易懂,可以說是零基礎也可快速掌握,如有疑問,歡迎留言,筆者會第一時間回復,本文代碼存于github
一、爬蟲的重要性:
如果把互聯網比喻成一個蜘蛛網,那么Spider就是在網上爬來爬去的蜘蛛,網路蜘蛛通過網頁的鏈接地址來尋找網頁,從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網頁,一直回圈下去,直到把整個網站所有的網頁都抓取完為止,
這里要注意:不管你是為了Python就業還是興趣愛好,記住:專案開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程專案,還可以跟老司機交流討教!
摘取部分網友的回復: 1、之前在北京買房,誰想房價開始瘋長,鏈家的房價等資料分析只給了一小部分,遠遠不能滿足自己的需求,于是晚上花了幾個小時的時間寫了個爬蟲,爬下了北京所有的小區資訊及北京所有小區的所有歷史成交記錄,
2、我的愛人是某網路公司的銷售,需要收集各種企業資訊然后打電話聯系,于是乎利用采集腳本抓一坨一坨的資料給她用,而她的同事天天自己搜資料整理到半夜,
二、實踐:爬取電影天堂電影詳情頁
1、網頁分析及爬取第一頁的詳情頁url
從電影天堂最新電影界面,可以看到其第一頁url為 www.ygdy8.net/html/gndy/d… ,第二頁為www.ygdy8.net/html/gndy/d…,第三第四頁也類似
from lxml import etree
import requests
url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html'
headers = {
'User_Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
response = requests.get(url,headers=headers)
# response.text 是系統自己默認判斷,但很遺憾判斷錯誤,導致亂碼出現,我們可以采取另外方式 response.content,自己指定格式解碼
# print(response.text)
# print(response.content.decode('gbk'))
print(response.content.decode(encoding="gbk", errors="ignore"))
復制代碼
先以第一頁為例,列印資料如下:
分析電影天堂 html 源代碼,可以得出每個 table 標簽就是一個電影
通過 xpath 拿到每個電影的詳情url
html = etree.HTML(text)
detail_urls = html.xpath("//table[@class='tbspan']//a/@href")
for detail_url in detail_urls:
print(detail_url) #加上域名即為詳情 url
復制代碼
結果如下:
2、整理代碼并爬取前7頁的電影串列url
from lxml import etree
import requests
# 域名
BASE_DOMAIN = 'http://www.ygdy8.net'
# url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html'
HEADERS = {
'User_Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
def spider():
base_url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_{}.html'
for x in range(1,8):
url = base_url.format(x)
print(url) # 求出每一頁電影串列的url eg: http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html
if __name__ == '__main__':
spider()
復制代碼
3、爬取每一部電影的詳情頁地址
def get_detail_urls(url):
response = requests.get(url, headers=HEADERS)
# response.text 是系統自己默認判斷,但很遺憾判斷錯誤,導致亂碼出現,我們可以采取另外方式 response.content,自己指定格式解碼
# print(response.text)
# print(response.content.decode('gbk'))
# print(response.content.decode(encoding="gbk", errors="ignore"))
text = response.content.decode(encoding="gbk", errors="ignore")
# 通過 xpath 拿到每個電影的詳情url
html = etree.HTML(text)
detail_urls = html.xpath("//table[@class='tbspan']//a/@href")
detail_urls = map(lambda url:BASE_DOMAIN+url,detail_urls) #這句意思相當于下面一段代碼:替換串列中的每一個url
# def abc(url):
# return BASE_DOMAIN+url
# index = 1
# for detail_url in detail_urls:
# detail_url = abc(detail_url)
# detail_urls[index] = detail_url
# index+1
return detail_urls
復制代碼
4、抓取電影詳情頁的資料
# 決議詳情頁面
def parse_detail_page(url):
movie = {}
response = requests.get(url,headers = HEADERS)
text = response.content.decode('gbk', errors='ignore')
html = etree.HTML(text)
# title = html.xpath("//div[@class='title_all']//font[@color='#07519a']") # 本行47行,下面已修改
# 列印出 [<Element font at 0x10cb422c8>, <Element font at 0x10cb42308>]
# print(title)
# 為了顯示,我們需要轉一下編碼
# for x in title:
# print(etree.tostring(x,encoding='utf-8').decode('utf-8'))
# 我們是為了取得文字,所以修改47行
title = html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()")[0]
movie['title'] = title
zoomE = html.xpath("//div[@id='Zoom']") [0] # 求出共同的頂級容器,方便后面求職
imgs = zoomE.xpath(".//img/@src") # 求出海報和截圖
cover = imgs[0]
if len(imgs) > 1:
screenshot = imgs[1]
movie['screenshot'] = screenshot
# print(cover)
movie['cover'] = cover
infos = zoomE.xpath(".//text()")
for index,info in enumerate(infos):
if info.startswith('◎年  代'):
info = info.replace("◎年  代", "").strip() # strip 去掉空格
movie['year'] = info
elif info.startswith("◎產  地"):
info = info.replace("◎產  地", "").strip()
movie["country"] = info
elif info.startswith("◎類  別"):
info = info.replace("◎類  別", "").strip()
movie["category"] = info
elif info.startswith("◎豆瓣評分"):
info = info.replace("◎豆瓣評分", "").strip()
movie["douban_rating"] = info
elif info.startswith("◎片  長"):
info = info.replace("◎片  長","").strip()
movie["duration"] = info
elif info.startswith("◎導  演"):
info = info.replace("◎導  演", "").strip()
movie["director"] = info
elif info.startswith("◎主  演"):
actors = []
actor = info.replace("◎主  演", "").strip()
actors.append(actor)
# 因為主演有很多個,再加上其在電影天堂中元素的特殊性,需要遍歷一遍,在分別求出每一個演員
for x in range(index+1,len(infos)): # 從演員 infos 開始遍歷,求出每一個演員
actor = infos[x].strip()
if actor.startswith("◎"): # 也就是到了標簽 的 ◎ 就退出
break
actors.append(actor)
movie['actor'] = actors
elif info.startswith('◎簡  介 '):
# info = info.replace('◎簡  介 ',"").strip()
for x in range(index+1,len(infos)):
if infos[x].startswith("◎獲獎情況"):
break
profile = infos[x].strip()
movie['profile'] = profile
# print(movie)
elif info.startswith('◎獲獎情況 '):
awards = []
# info = info.replace("◎獲獎情況 ", "").strip()
for x in range(index+1,len(infos)):
if infos[x].startswith("【下載地址】"):
break
award = infos[x].strip()
awards.append(award)
movie['awards'] = awards
# print(awards)
download_url = html.xpath("//td[@bgcolor='#fdfddf']/a/@href")[0]
movie['download_url'] = download_url
return movie
復制代碼
上述代碼爬取了電影的每一個資料,為了讓讀者方便對照格式,筆者已經下載了寫此篇文章時的html—— "movie.html",放于github 中
最后結果:
總結注意:不管你是為了Python就業還是興趣愛好,記住:專案開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程專案,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/153807.html
標籤:Python
下一篇:Python爬蟲實踐入門,超詳細
