利用requests庫進行靜态頁面的爬取之豆瓣Top250
我知道網上有很多的爬蟲教學,我之前自己也去網上看,但是好像每一個都不同,而且好像都很進階,後來還是别人教我去抓取網頁或是節點,這和我在網上看到的其他爬取的方法都不一樣,畢竟網上的都很進階,我隻是一個小白。
今天示範的是爬取豆瓣電影Top250的電影及其導演和引言。
爬蟲分為三步:
1、擷取網頁
2、解析網頁
3、提取資訊
4、資料處理
注:以下操作都是在谷歌浏覽器進行
那麼進行這個之前,你的電腦先要有requests和bs4這兩個庫。
這裡有個小建議呀,如果你直接pip install xxx是很慢的,很痛苦,因為這是在國外的。
在國内的話,你也可以用豆瓣源
①pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn xxx(清華提供的python的各種庫)
②http://pypi.douban.com/simple/(豆瓣提供的python的各種庫)
ps:網上好多人建議用豆瓣源emmmmm,但是我沒有,我一隻都是用第一種的。
下面就直接示範用第一種方法,就直接複制就行了,然後在xxx的地方換上所裝的庫,當然有時也會翻車,嘗試多幾次就行了,比直接pip install xxx是要好很多的!
如果沒有紅色出現,并且像下面這個樣子的時候就是完成了(之前安裝了requests和bs4,我就隻是拿裝個ipython作為例子)
安裝完之後就可以呈上代碼了,先導入庫。
import requests
from bs4 import BeautifulSoup
敲黑闆,劃重點!BeautifulSoup有解析網頁的作用!
1.擷取網頁
第一步有點繁瑣,希望大家有點耐心,後面就很快了!
如果是要擷取網頁,我們就先了解這個網頁嘛,觀察這個網頁是動态還是靜态,那麼今天先是以豆瓣電影Top250的頁面開刀
先到豆瓣電影Top250的頁面。
因為這是靜态的文本,是以就是可以直接在網頁代碼上面找到相關内容
那麼上面箭頭的部分就是我們所要爬取到内容。
由于爬蟲需要有請求頭,是以我們要先找到請求頭
那麼下面提供一種懶人請求頭的方法。
還是以豆瓣網址為例:
1.按下F12,找到NetWork,然後看到name那邊,當然第一次進去是空的,那麼可以先重新整理一下就可以有了。
看到頭部分,然後将其curl(base)部分複制下來
然後到python爬蟲懶人請求頭方法
呈上代碼:
import requests
cookies = {
'bid': 'rmK1EcA3r2s',
'douban-fav-remind': '1',
'll': '108307',
'__yadk_uid': 'EJwuEzTIVazCD6p6x1iHue85SnWjRlB5',
'_vwo_uuid_v2': 'D34D2B043520CA650F6C4DC668A88DA31|597fb0686dd33356e891115ef92a29ba',
'__gads': 'ID=63dfd78ef423c877:T=1580267930:S=ALNI_MZzMqVe3mnbI1vr-EzQAwwxmvaC5A',
'ct': 'y',
'__utmz': '30149280.1581656678.9.4.utmcsr=baidu|utmccn=(organic)|utmcmd=organic',
'_pk_ref.100001.4cf6': '%5B%22%22%2C%22%22%2C1582597634%2C%22https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3D%25E8%25B1%2586%25E7%2593%25A3%26rsv_spt%3D1%26rsv_iqid%3D0xad5f1d05001c7050%26issp%3D1%26f%3D8%26rsv_bp%3D1%26rsv_idx%3D2%26ie%3Dutf-8%26tn%3D62095104_36_oem_dg%26rsv_enter%3D1%26rsv_dl%3Dtb%26rsv_sug2%3D0%26inputT%3D1216%26rsv_sug4%3D1779%22%5D',
'_pk_ses.100001.4cf6': '*',
'ap_v': '0,6.0',
'__utma': '30149280.2011140489.1580267903.1581656678.1582597635.10',
'__utmc': '30149280',
'__utmb': '223695111.0.10.1582597635',
'_pk_id.100001.4cf6': '6057282de3ce6902.1580267911.8.1582598700.1581658464.',
'__utmt_douban': '1',
}
headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.16 Safari/537.36',
'Sec-Fetch-User': '?1',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'navigate',
'Referer': 'https://movie.douban.com/chart',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
response = requests.get('https://movie.douban.com/top250', headers=headers, cookies=cookies)
那麼第一步擷取網頁就完成了!
requests.get就是擷取到這個網頁了!你可以吧response的出來看看。
響應200!成功響應!
2.解析網頁
那麼這一步就要用到BeautifulSoup了!
response.encoding='utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
第一行是防止亂碼的情況,是以就加入了encoding=“utf-8”
(PS:大家也盡量避開英文的名字,不然也可能出現亂碼的情況)
第二行就是解析網頁了。
第二步結束啦啦啦啦!!!很快吧!嘻嘻
3.提取資訊
但是注意了,這樣複制下來僅僅隻是複制了一個電影題目而已,就單單是《肖申克的救贖》這一個點而已,那麼了解過前端的同學呢都知道這些排版都是有規律的,不然就會顯得沒有邏輯可尋。
我們可以把兩個标題都給複制下來,就會有以下結果:
《肖申克的救贖》
#content > div > div.article > ol > li:nth-child(1) > div > div.info > div.hd > a > span:nth-child(1)
《霸王别姬》
#content > div > div.article > ol > li:nth-child(2) > div > div.info > div.hd > a > span.title
我們可以發現大部分元素都是一樣的,但是有個别元素不同,那麼我們就可以将不同元素的都去除掉,留下相同元素,就可以進行相關節點的抓取
就會有以下的代碼
那麼其他的元素(電影導演,電影引言)節點也是這樣的啦!
記得不是點中文那裡,是點那些英文那裡才會有這個selector噢
dirtor = "#content > div > div.article > ol > li > div > div.info > div.bd > p:nth-child(1)"
quote='#content > div > div.article > ol > li > div > div.info > div.bd > p.quote'
那麼第三部分提取元素就完成啦!!!嘻嘻~
4.資料的處理
我們要先将提取的元素進行分解。
a=soup.select(title)
b=soup.select(dirtor)
c=soup.select(quote)
當然如果就直接将以上幾個節點打出來的話,是有一些非漢字的東西的,比如說一些前端東西。
那麼直接上.text就行了,就不需要用到正規表達式去截取字元串了。
a[i] = a[i].text
b[i] = b[i].text
c[i] = c[i].text
最後再直接打出來就行了。
當然啦,現在其實隻是完成十分之一,因為我們隻是完成了第一頁而已,還有剩下九頁的内容。
附加部分.資料的完善
那麼我們可以觀察豆瓣網頁,就可以發現,頁數之間也是有規律的!
我們可以看到這個上面的start的變化(第二頁)
下面的http那一行其實就是那個網頁了嘛
我們可以看到這個上面的start的變化(第三頁)
有木有!!xiongdei!25!50!規律就出來了,由于每個頁面都是相似的,節點也是相似的,是以我們就可以進行其他的節點的抓取!
那麼我們一個for循環就可以了!利用其字元串的拼接。
for k in range(0,10):
i=k*25
res = requests.get('https://movie.douban.com/top250?start='+str(i)+'&filter=', headers=headers)
這樣就可以将十頁的元素都提取出來了。
如何我們想将其放入本地的檔案的話呢可以這樣操作
要先導入os庫
import os
打開一個檔案
将爬取的内容放入其中
fo.write(a[i])
fo.write(b[i])
fo.write(c[i])
關閉檔案
完整代碼展示
import os
import requests
from bs4 import BeautifulSoup
cookies = {
'bid': 'E4gkXiSwBrM',
'douban-fav-remind': '1',
'll': '118088',
'__yadk_uid': 'hkoioWDL1agCeIP3VyFfyXTl6SBJ1uf3',
}
headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'DNT': '1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
'Sec-Fetch-User': '?1',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'navigate',
'Referer': 'https://movie.douban.com/top250?start=225&filter=',
'Accept-Encoding': '',
'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
}
params = (
('start', '0'),
('filter', ''),
)
fo = open("豆瓣Movies Top250.txt",'a',encoding="utf-8")
for k in range(0,10):
i=k*25
response = requests.get('https://movie.douban.com/top250?start='+str(i)+'&filter=', headers=headers)
response.encoding='utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
title = "#content > div > div.article > ol > li > div > div.info > div.hd > a"
dirtor = "#content > div > div.article > ol > li > div > div.info > div.bd > p:nth-child(1)"
quote='#content > div > div.article > ol > li > div > div.info > div.bd > p.quote'
a=soup.select(title)
b=soup.select(dirtor)
c=soup.select(quote)
for i in range(0,len(a)):
a[i] = a[i].text
b[i] = b[i].text
c[i] = c[i].text
fo.write(a[i])
fo.write(b[i])
fo.write(c[i])
print(" 電影名字 :{}\n 電影導演:{}\n 電影引言: {}\n ".format(a[i],b[i],c[i]),end="")
fo.close()
控制台效果:
文本效果:
但是關于這個爬取資訊的排版我還不是很懂,是以就沒進行排版的操作,是以就是這樣的了。如果有大佬看到的話,可以指點一下嗎。。。(估計大佬也不會看這種級别的。。)
分享一個我在爬蟲當中的問題:就是我有一次爬蟲的時候,第一次運作爬下來了,第二次就不行了,所爬取的網頁也會有一個提示,說檢查到啥啥啥的,不記得了,這就是反爬蟲了,我也不懂怎麼解決,我當時是覺得這個ip不能用了,就用手機熱點試試,結果就又可以了。
這就是我的第一個爬蟲,希望能幫到想學習的你,我也是一個小白,有什麼地方錯的或是你不了解的,也可以在下面說說,看到我也會回複的!嘻嘻~