天天看點

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

利用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是要好很多的!

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

如果沒有紅色出現,并且像下面這個樣子的時候就是完成了(之前安裝了requests和bs4,我就隻是拿裝個ipython作為例子)

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

安裝完之後就可以呈上代碼了,先導入庫。

import requests
from bs4 import BeautifulSoup
           

敲黑闆,劃重點!BeautifulSoup有解析網頁的作用!

1.擷取網頁

第一步有點繁瑣,希望大家有點耐心,後面就很快了!

如果是要擷取網頁,我們就先了解這個網頁嘛,觀察這個網頁是動态還是靜态,那麼今天先是以豆瓣電影Top250的頁面開刀

先到豆瓣電影Top250的頁面。

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

因為這是靜态的文本,是以就是可以直接在網頁代碼上面找到相關内容

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

那麼上面箭頭的部分就是我們所要爬取到内容。

由于爬蟲需要有請求頭,是以我們要先找到請求頭

那麼下面提供一種懶人請求頭的方法。

還是以豆瓣網址為例:

1.按下F12,找到NetWork,然後看到name那邊,當然第一次進去是空的,那麼可以先重新整理一下就可以有了。

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示
小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示
小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

看到頭部分,然後将其curl(base)部分複制下來

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

然後到python爬蟲懶人請求頭方法

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

呈上代碼:

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的出來看看。

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

響應200!成功響應!

2.解析網頁

那麼這一步就要用到BeautifulSoup了!

response.encoding='utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
           

第一行是防止亂碼的情況,是以就加入了encoding=“utf-8”

(PS:大家也盡量避開英文的名字,不然也可能出現亂碼的情況)

第二行就是解析網頁了。

第二步結束啦啦啦啦!!!很快吧!嘻嘻

3.提取資訊

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示
小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

但是注意了,這樣複制下來僅僅隻是複制了一個電影題目而已,就單單是《肖申克的救贖》這一個點而已,那麼了解過前端的同學呢都知道這些排版都是有規律的,不然就會顯得沒有邏輯可尋。

我們可以把兩個标題都給複制下來,就會有以下結果:

《肖申克的救贖》

#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

我們可以發現大部分元素都是一樣的,但是有個别元素不同,那麼我們就可以将不同元素的都去除掉,留下相同元素,就可以進行相關節點的抓取

就會有以下的代碼

那麼其他的元素(電影導演,電影引言)節點也是這樣的啦!

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

記得不是點中文那裡,是點那些英文那裡才會有這個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
           

最後再直接打出來就行了。

當然啦,現在其實隻是完成十分之一,因為我們隻是完成了第一頁而已,還有剩下九頁的内容。

附加部分.資料的完善

那麼我們可以觀察豆瓣網頁,就可以發現,頁數之間也是有規律的!

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

我們可以看到這個上面的start的變化(第二頁)

下面的http那一行其實就是那個網頁了嘛

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

我們可以看到這個上面的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()
           

控制台效果:

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

文本效果:

小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示
小白喜提python爬蟲(一)看完即會,大神請繞路或是莅臨指導!!1.擷取網頁2.解析網頁3.提取資訊4.資料的處理附加部分.資料的完善完整代碼展示

但是關于這個爬取資訊的排版我還不是很懂,是以就沒進行排版的操作,是以就是這樣的了。如果有大佬看到的話,可以指點一下嗎。。。(估計大佬也不會看這種級别的。。)

分享一個我在爬蟲當中的問題:就是我有一次爬蟲的時候,第一次運作爬下來了,第二次就不行了,所爬取的網頁也會有一個提示,說檢查到啥啥啥的,不記得了,這就是反爬蟲了,我也不懂怎麼解決,我當時是覺得這個ip不能用了,就用手機熱點試試,結果就又可以了。

這就是我的第一個爬蟲,希望能幫到想學習的你,我也是一個小白,有什麼地方錯的或是你不了解的,也可以在下面說說,看到我也會回複的!嘻嘻~