小白喜提python爬蟲~看完即會,大神請繞路或是蒞臨指導!!

這是我參與8月更文挑戰的第 11 天,活動詳情查看:8月更文挑戰html

利用requests庫進行靜態頁面的爬取之豆瓣Top250

我知道網上有不少的爬蟲教學,我以前本身也去網上看,可是好像每個都不一樣,並且好像都很高級,後來仍是別人教我去抓取網頁或是節點,這和我在網上看到的其餘爬取的方法都不同,畢竟網上的都很高級,我只是一個小白。 今天演示的是爬取豆瓣電影Top250的電影及其導演和引言。 爬蟲分爲三步: 一、獲取網頁 二、解析網頁 三、提取信息 四、數據處理 注:如下操做都是在谷歌瀏覽器進行前端

那麼進行這個以前,你的電腦先要有requests和bs4這兩個庫。 這裏有個小建議呀,若是你直接pip install xxx是很慢的,很痛苦,由於這是在國外的。 在國內的話,你也能夠用豆瓣源 ①pip install -i pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn xxx(清華提供的python的各類庫) ②pypi.douban.com/simple/(豆瓣提… ps:網上好多人建議用豆瓣源emmmmm,可是我沒有,我一隻都是用第一種的。 下面就直接演示用第一種方法,就直接複製就好了,而後在xxx的地方換上所裝的庫,固然有時也會翻車,嘗試多幾回就好了,比直接pip install xxx是要好不少的! 在這裏插入圖片描述 若是沒有紅色出現,而且像下面這個樣子的時候就是完成了(以前安裝了requests和bs4,我就只是拿裝個ipython做爲例子) 在這裏插入圖片描述 安裝完以後就能夠呈上代碼了,先導入庫。python

import requests
from bs4 import BeautifulSoup
複製代碼

敲黑板,劃重點!BeautifulSoup有解析網頁的做用!web


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!成功響應!markdown


2.解析網頁


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

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

第一行是防止亂碼的狀況,因此就加入了encoding="utf-8" (PS:你們也儘可能避開英文的名字,否則也可能出現亂碼的狀況) 第二行就是解析網頁了。 第二步結束啦啦啦啦!!!很快吧!嘻嘻app


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 咱們能夠發現大部分元素都是同樣的,可是有個別元素不一樣,那麼咱們就能夠將不一樣元素的都去除掉,留下相同元素,就能夠進行相關節點的抓取 就會有如下的代碼python爬蟲

title = "#content > div > div.article > ol > li > div > div.info > div.hd > a"
複製代碼

那麼其餘的元素(電影導演,電影引言)節點也是這樣的啦! 在這裏插入圖片描述 記得不是點中文那裏,是點那些英文那裏纔會有這個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
複製代碼

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

print(" 電影名字 :{}\n 電影導演:{}\n 電影引言: {}\n ".format(a[i],b[i],c[i]),end="")
複製代碼

固然啦,如今其實只是完成十分之一,由於咱們只是完成了第一頁而已,還有剩下九頁的內容。


附加部分.數據的完善


那麼咱們能夠觀察豆瓣網頁,就能夠發現,頁數之間也是有規律的! 在這裏插入圖片描述 咱們能夠看到這個上面的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 = open("豆瓣Movies Top250.txt",'a',encoding="utf-8")
複製代碼

將爬取的內容放入其中

fo.write(a[i])
fo.write(b[i])
fo.write(c[i])
複製代碼

關閉文件

fo.close()
複製代碼

完整代碼展現

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不能用了,就用手機熱點試試,結果就又能夠了。

這就是個人第一個爬蟲,但願能幫到想學習的你,我也是一個小白,有什麼地方錯的或是你不理解的,也能夠在下面說說,看到我也會回覆的!嘻嘻~

相關文章
相關標籤/搜索