臨近放假,無心看代碼,乾脆做點趣味的事情,爬蟲找幾部電影,打發旅途時間。(頭一次,爲自己編程^_^)
python爬蟲,基本參考 網絡爬蟲實戰:爬取並下載《電影天堂》3千多部動作片電影 這個博主的文章,但是碰到亂碼,也是按照該博主的blog提示解決了,然後這裏自己加了個過濾評分的。
# 我們用到的庫
#大體來自原博客 https://blog.csdn.net/wenxuhonghe/article/details/84897936
import requests
import bs4
import re
import pandas as pd
def get_data(url):
'''
功能:訪問 url 的網頁,獲取網頁內容並返回
參數:
url :目標網頁的 url
返回:目標網頁的 html 內容
'''
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
try:
r = requests.get(url, headers=headers)
r.raise_for_status()
#add:canok
#下面這個,自動推測網站編碼,避免亂碼
r.encoding = r.apparent_encoding
return r.text
except requests.HTTPError as e:
print(e)
print("HTTPError")
except requests.RequestException as e:
print(e)
except:
print("Unknown Error !")
def parse_data(html):
'''
功能:提取 html 頁面信息中的關鍵信息,並整合一個數組並返回
參數:html 根據 url 獲取到的網頁內容
返回:存儲有 html 中提取出的關鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []
# 獲取電影列表
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})
# 對電影列表中的每一部電影單獨處理
for item in tbList:
movie = []
link = item.b.find_all('a')[1]
# 獲取電影的名稱
name = link["title"]
# 獲取詳情頁面的 url
url = 'https://www.dy2018.com' + link["href"]
try:
# 訪問電影的詳情頁面,查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')
score = 0
#add: canok 添加評分過濾:
score_co = temp.find_all('span')
for i in score_co:
#print(i)
if '評分:' in i:
#print('找到評分',i)
score = float(i.strong.text)
break
if score < 7.0:
print('score too low,skip',score,name)
continue
else:
# 將數據存放到電影信息列表裏
movie.append(name)
movie.append(url)
#print(name,url)
# 下載鏈接有多個(也可能沒有),這裏將所有鏈接都放進來
for i in tbody:
download = i.a.text
movie.append(download)
#print(download)
#print(movie)
# 將此電影的信息加入到電影列表中
info.append(movie)
except Exception as e:
print(e)
return info
def save_data(data):
'''
功能:將 data 中的信息輸出到文件中/或數據庫中。
參數:data 將要保存的數據
'''
filename = './電影天堂.csv'
dataframe = pd.DataFrame(data)
dataframe.to_csv(filename,encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)
def main():
# 循環爬取多頁數據
for page in range(1, 2):
print('正在爬取:第' + str(page) + '頁......')
# 根據之前分析的 URL 的組成結構,構造新的 url
if page == 1:
index = 'index'
else:
index = 'index_' + str(page)
url = 'https://www.dy2018.com/2/'+ index +'.html'
# 依次調用網絡請求函數,網頁解析函數,數據存儲函數,爬取並保存該頁數據
html = get_data(url)
movies = parse_data(html)
if movies:
save_data(movies)
#print(movies)
break
print('第' + str(page) + '頁完成!')
if __name__ == '__main__':
print('爬蟲啓動成功!')
main()
print('爬蟲執行完畢!')
評分的標籤:
上面只抓了3頁,過濾小於7.0評分的資源。