成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python爬蟲入門教程!手把手教會你爬取網頁數據

開發 后端
其實在當今社會,網絡上充斥著大量有用的數據,我們只需要耐心的觀察,再加上一些技術手段,就可以獲取到大量的有價值數據。這里的“技術手段”就是網絡爬蟲。今天就給大家分享一篇爬蟲基礎知識和入門教程。

其實在當今社會,網絡上充斥著大量有用的數據,我們只需要耐心的觀察,再加上一些技術手段,就可以獲取到大量的有價值數據。這里的“技術手段”就是網絡爬蟲。今天就給大家分享一篇爬蟲基礎知識和入門教程:

[[348531]]

什么是爬蟲?

爬蟲就是自動獲取網頁內容的程序,例如搜索引擎,Google,Baidu 等,每天都運行著龐大的爬蟲系統,從全世界的網站中爬蟲數據,供用戶檢索時使用。

爬蟲流程

其實把網絡爬蟲抽象開來看,它無外乎包含如下幾個步驟

  • 模擬請求網頁。模擬瀏覽器,打開目標網站。
  • 獲取數據。打開網站之后,就可以自動化的獲取我們所需要的網站數據。
  • 保存數據。拿到數據之后,需要持久化到本地文件或者數據庫等存儲設備中。

那么我們該如何使用 Python 來編寫自己的爬蟲程序呢,在這里我要重點介紹一個 Python 庫:Requests。

Requests 使用

Requests 庫是 Python 中發起 HTTP 請求的庫,使用非常方便簡單。

模擬發送 HTTP 請求

發送 GET 請求

當我們用瀏覽器打開豆瓣首頁時,其實發送的最原始的請求就是 GET 請求

 

  1. import requests 
  2. res = requests.get('http://www.douban.com'
  3. print(res) 
  4. print(type(res)) 
  5. >>> 
  6. <Response [200]> 
  7. <class 'requests.models.Response'

可以看到,我們得到的是一個 Response 對象

如果我們要獲取網站返回的數據,可以使用 text 或者 content 屬性來獲取

text:是以字符串的形式返回數據

content:是以二進制的方式返回數據

 

  1. print(type(res.text)) 
  2. print(res.text) 
  3. >>> 
  4. <class 'str'> <!DOCTYPE HTML> 
  5. <html lang="zh-cmn-Hans" class=""
  6. <head> 
  7. <meta charset="UTF-8"
  8. <meta name="google-site-verification" content="ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw" /> 
  9. <meta name="description" content="提供圖書、電影、音樂唱片的推薦、評論和價格比較,以及城市獨特的文化生活。"
  10. <meta name="keywords" content="豆瓣,廣播,登陸豆瓣">..... 

發送 POST 請求

對于 POST 請求,一般就是提交一個表單

  1. r = requests.post('http://www.xxxx.com', data={"key""value"}) 

data 當中,就是需要傳遞的表單信息,是一個字典類型的數據。

header 增強

對于有些網站,會拒絕掉沒有攜帶 header 的請求的,所以需要做一些 header 增強。比如:UA,Cookie,host 等等信息。

 

  1. header = {"User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
  2.          "Cookie""your cookie"
  3. res = requests.get('http://www.xxx.com', headers=header) 

解析 HTML

現在我們已經獲取到了網頁返回的數據,即 HTML 代碼,下面就需要解析 HTML,來提取其中有效的信息。

BeautifulSoup

BeautifulSoup 是 Python 的一個庫,最主要的功能是從網頁解析數據。

  1. from bs4 import BeautifulSoup  # 導入 BeautifulSoup 的方法 
  2. # 可以傳入一段字符串,或者傳入一個文件句柄。一般都會先用 requests 庫獲取網頁內容,然后使用 soup 解析。 
  3. soup = BeautifulSoup(html_doc,'html.parser')  # 這里一定要指定解析器,可以使用默認的 html,也可以使用 lxml。 
  4. print(soup.prettify())  # 按照標準的縮進格式輸出獲取的 soup 內容。 

BeautifulSoup 的一些簡單用法

 

  1. print(soup.title)  # 獲取文檔的 title 
  2. print(soup.title.name)  # 獲取 title 的 name 屬性 
  3. print(soup.title.string)  # 獲取 title 的內容 
  4. print(soup.p)  # 獲取文檔中第一個 p 節點 
  5. print(soup.p['class'])  # 獲取第一個 p 節點的 class 內容 
  6. print(soup.find_all('a'))  # 獲取文檔中所有的 a 節點,返回一個 list 
  7. print(soup.find_all('span', attrs={'style'"color:#ff0000"}))  # 獲取文檔中所有的 span 且 style 符合規則的節點,返回一個 list 

具體的用法和效果,我會在后面的實戰中詳細說明。

XPath 定位

XPath 是 XML 的路徑語言,是通過元素和屬性進行導航定位的。幾種常用的表達式

表達式含義node選擇 node 節點的所有子節點/從根節點選取//選取所有當前節點.當前節點..父節點@屬性選取text()當前路徑下的文本內容

一些簡單的例子

 

  1. xpath('node')  # 選取 node 節點的所有子節點 
  2. xpath('/div')  # 從根節點上選取 div 元素 
  3. xpath('//div')  # 選取所有 div 元素 
  4. xpath('./div')  # 選取當前節點下的 div 元素 
  5. xpath('//@id')  # 選取所有 id 屬性的節點 

當然,XPath 非常強大,但是語法也相對復雜,不過我們可以通過 Chrome 的開發者工具來快速定位到元素的 xpath,如下圖

 

Python爬蟲入門教程!手把手教會你爬取網頁數據

得到的 xpath 為

  1. //*[@id="anony-nav"]/div[1]/ul/li[1]/a 

在實際的使用過程中,到底使用 BeautifulSoup 還是 XPath,完全取決于個人喜好,哪個用起來更加熟練方便,就使用哪個。

爬蟲實戰:爬取豆瓣海報

我們可以從豆瓣影人頁,進入都影人對應的影人圖片頁面,比如以劉濤為例子,她的影人圖片頁面地址為

  • https://movie.douban.com/celebrity/1011562/photos/

 

Python爬蟲入門教程!手把手教會你爬取網頁數據

下面我們就來分析下這個網頁

目標網站頁面分析

注意:網絡上的網站頁面構成總是會變化的,所以這里你需要學會分析的方法,以此類推到其他網站。正所謂授人以魚不如授人以漁,就是這個原因。

Chrome 開發者工具

Chrome 開發者工具(按 F12 打開),是分析網頁的絕佳利器,一定要好好使用。

我們在任意一張圖片上右擊鼠標,選擇“檢查”,可以看到同樣打開了“開發者工具”,而且自動定位到了該圖片所在的位置

 

Python爬蟲入門教程!手把手教會你爬取網頁數據

可以清晰的看到,每張圖片都是保存在 li 標簽中的,圖片的地址保存在 li 標簽中的 img 中。

知道了這些規律后,我們就可以通過 BeautifulSoup 或者 XPath 來解析 HTML 頁面,從而獲取其中的圖片地址。

代碼編寫

我們只需要短短的幾行代碼,就能完成圖片 url 的提取

 

  1. import requests 
  2. from bs4 import BeautifulSoup  
  3.  
  4. url = 'https://movie.douban.com/celebrity/1011562/photos/' 
  5. res = requests.get(url).text 
  6. content = BeautifulSoup(res, "html.parser"
  7. data = content.find_all('div', attrs={'class''cover'}) 
  8. picture_list = [] 
  9. for d in data: 
  10.     plist = d.find('img')['src'
  11.     picture_list.append(plist) 
  12. print(picture_list) 
  13. >>> 
  14. ['https://img1.doubanio.com/view/photo/m/public/p2564834267.jpg''https://img1.doubanio.com/view/photo/m/public/p860687617.jpg''https://img1.doubanio.com/view/photo/m/public/p2174001857.jpg''https://img1.doubanio.com/view/photo/m/public/p1563789129.jpg''https://img3.doubanio.com/view/photo/m/public/p2363429946.jpg''https://img1.doubanio.com/view/photo/m/public/p2382591759.jpg''https://img3.doubanio.com/view/photo/m/public/p2363269182.jpg''https://img1.doubanio.com/view/photo/m/public/p1959495269.jpg''https://img3.doubanio.com/view/photo/m/public/p2356638830.jpg''https://img3.doubanio.com/view/photo/m/public/p1959495471.jpg''https://img3.doubanio.com/view/photo/m/public/p1834379290.jpg''https://img3.doubanio.com/view/photo/m/public/p2325385303.jpg''https://img3.doubanio.com/view/photo/m/public/p2361707270.jpg''https://img3.doubanio.com/view/photo/m/public/p2325385321.jpg''https://img3.doubanio.com/view/photo/m/public/p2196488184.jpg''https://img1.doubanio.com/view/photo/m/public/p2186019528.jpg''https://img1.doubanio.com/view/photo/m/public/p2363270277.jpg''https://img3.doubanio.com/view/photo/m/public/p2325240501.jpg''https://img1.doubanio.com/view/photo/m/public/p2258657168.jpg''https://img1.doubanio.com/view/photo/m/public/p2319710627.jpg''https://img3.doubanio.com/view/photo/m/public/p2319710591.jpg''https://img3.doubanio.com/view/photo/m/public/p2311434791.jpg''https://img1.doubanio.com/view/photo/m/public/p2363270708.jpg''https://img3.doubanio.com/view/photo/m/public/p2258657185.jpg''https://img3.doubanio.com/view/photo/m/public/p2166193915.jpg''https://img3.doubanio.com/view/photo/m/public/p2363265595.jpg''https://img3.doubanio.com/view/photo/m/public/p2312085755.jpg''https://img3.doubanio.com/view/photo/m/public/p2311434790.jpg''https://img3.doubanio.com/view/photo/m/public/p2276569205.jpg''https://img1.doubanio.com/view/photo/m/public/p2165332728.jpg'

可以看到,是非常干凈的列表,里面存儲了海報地址。

但是這里也只是一頁海報的數據,我們觀察頁面發現它有好多分頁,如何處理分頁呢。

 

Python爬蟲入門教程!手把手教會你爬取網頁數據

分頁處理

我們點擊第二頁,看看瀏覽器 url 的變化

  • https://movie.douban.com/celebrity/1011562/photos/?type=C&start=30&sortby=like&size=a&subtype=a

發現瀏覽器 url 增加了幾個參數

再點擊第三頁,繼續觀察 url

  • https://movie.douban.com/celebrity/1011562/photos/?type=C&start=60&sortby=like&size=a&subtype=a

通過觀察可知,這里的參數,只有 start 是變化的,即為變量,其余參數都可以按照常理來處理

同時還可以知道,這個 start 參數應該是起到了類似于 page 的作用,start = 30 是第二頁,start = 60 是第三頁,依次類推,最后一頁是 start = 420。

于是我們處理分頁的代碼也呼之欲出了

首先將上面處理 HTML 頁面的代碼封裝成函數

 

  1. def get_poster_url(res): 
  2.     content = BeautifulSoup(res, "html.parser"
  3.     data = content.find_all('div', attrs={'class''cover'}) 
  4.     picture_list = [] 
  5.     for d in data: 
  6.         plist = d.find('img')['src'
  7.         picture_list.append(plist) 
  8.     return picture_list 

然后我們在另一個函數中處理分頁和調用上面的函數

 

  1. def fire(): 
  2.     page = 0 
  3.     for i in range(0, 450, 30): 
  4.         print("開始爬取第 %s 頁" % page) 
  5.         url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) 
  6.         res = requests.get(url).text 
  7.         data = get_poster_url(res) 
  8.         page += 1 

此時,我們所有的海報數據都保存在了 data 變量中,現在就需要一個下載器來保存海報了

 

  1. def download_picture(pic_l): 
  2.     if not os.path.exists(r'picture'): 
  3.         os.mkdir(r'picture'
  4.     for i in pic_l: 
  5.         pic = requests.get(i) 
  6.         p_name = i.split('/')[7] 
  7.         with open('picture\\' + p_name, 'wb') as f: 
  8.             f.write(pic.content) 

再增加下載器到 fire 函數,此時為了不是請求過于頻繁而影響豆瓣網的正常訪問,設置 sleep time 為1秒

 

  1. def fire(): 
  2.     page = 0 
  3.     for i in range(0, 450, 30): 
  4.         print("開始爬取第 %s 頁" % page) 
  5.         url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) 
  6.         res = requests.get(url).text 
  7.         data = get_poster_url(res) 
  8.         download_picture(data) 
  9.         page += 1 
  10.         time.sleep(1) 

下面就執行 fire 函數,等待程序運行完成后,當前目錄下會生成一個 picture 的文件夾,里面保存了我們下載的所有海報

 

Python爬蟲入門教程!手把手教會你爬取網頁數據

核心代碼講解

下面再來看下完整的代碼

 

  1. import requests 
  2. from bs4 import BeautifulSoup 
  3. import time 
  4. import osdef fire(): 
  5.     page = 0 
  6.     for i in range(0, 450, 30): 
  7.         print("開始爬取第 %s 頁" % page) 
  8.         url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) 
  9.         res = requests.get(url).text 
  10.         data = get_poster_url(res) 
  11.         download_picture(data) 
  12.         page += 1 
  13.         time.sleep(1)def get_poster_url(res): 
  14.     content = BeautifulSoup(res, "html.parser"
  15.     data = content.find_all('div', attrs={'class''cover'}) 
  16.     picture_list = [] 
  17.     for d in data: 
  18.         plist = d.find('img')['src'
  19.         picture_list.append(plist) 
  20.     return picture_listdef download_picture(pic_l): 
  21.     if not os.path.exists(r'picture'): 
  22.         os.mkdir(r'picture'
  23.     for i in pic_l: 
  24.         pic = requests.get(i) 
  25.         p_name = i.split('/')[7] 
  26.         with open('picture\\' + p_name, 'wb') as f: 
  27.             f.write(pic.content)if __name__ == '__main__'
  28.     fire() 

fire 函數

這是一個主執行函數,使用 range 函數來處理分頁。

  • range 函數可以快速的創建整數列表,在 for 循環時及其好用。函數中的0代表從0開始計數,450代表一直迭代到450,不包含450,30代表步長,即每次遞增的數字間隔。range(0, 450, 30),依次會輸出:0,30,60,90 …
  • format 函數,是一種字符串格式化方式
  • time.sleep(1) 即為暫停1秒鐘

get_poster_url 函數

這個就是解析 HTML 的函數,使用的是 BeautifulSoup

  • 通過 find_all 方法查找所有 class 為 “cover” 的 div 元素,返回的是一個列表
  • 使用 for 循環,循環上一步拿到的列表,取出 src 的內容,append 到列表中
  • append 是列表的一個方法,可以在列表后面追加元素

download_picture 函數

簡易圖片下載器

  • 首先判斷當前目錄下是否存在 picture 文件夾,os.path.exists
  • os 庫是非常常用用來操作系統相關的命令庫,os.mkdir 就是創建文件夾
  • split 用于切割字符串,取出角標為7的元素,作為存儲圖片的名稱
  • with 方法用來快速打開文件,打開的進程可以自行關閉文件句柄,而不再需要手動執行 f.close() 關閉文件

總結

本節講解了爬蟲的基本流程以及需要用到的 Python 庫和方法,并通過一個實際的例子完成了從分析網頁,到數據存儲的全過程。其實爬蟲,無外乎模擬請求,解析數據,保存數據。

當然有的時候,網站還會設置各種反爬機制,比如 cookie 校驗,請求頻度檢查,非瀏覽器訪問限制,JS 混淆等等,這個時候就需要用到反反爬技術了,比如抓取 cookie 放到 headers 中,使用代理 IP 訪問,使用 Selenium 模擬瀏覽器等待方式。

由于本課程不是專門的爬蟲課,這些技能就留待你自己去探索挖掘啦。

 

Python爬蟲入門教程!手把手教會你爬取網頁數據

 

責任編輯:未麗燕 來源: 蘿卜大雜燴
相關推薦

2009-12-11 09:04:10

Windows搭建Li

2021-06-16 09:02:43

Pythonjieba分詞Python基礎

2020-10-12 08:19:43

Python爬蟲網頁數據

2009-12-21 11:36:24

Linux啟動加密

2009-10-22 15:23:32

VB.NET函數

2021-12-09 10:24:47

Javascript 高階函數前端

2010-07-30 10:41:23

DB2打補丁

2020-12-13 11:38:09

Go語言clac包

2018-05-16 13:50:30

Python網絡爬蟲Scrapy

2021-07-03 09:04:22

XPathPython免費代理IP

2020-03-08 22:06:16

Python數據IP

2021-04-30 09:05:37

爬蟲框架數據

2021-05-08 08:04:05

Python爬取素材

2020-07-10 08:24:18

Python開發工具

2020-11-10 09:11:02

采集數據

2018-05-22 15:30:30

Python網絡爬蟲分布式爬蟲

2022-06-30 08:13:44

PythonWeb編程語言

2022-10-30 10:31:42

i2ccpuftrace

2018-05-14 16:34:08

Python網絡爬蟲Scrapy

2018-05-16 15:46:06

Python網絡爬蟲PhantomJS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品久久久 | 99热热| 99免费看 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | www.亚洲区 | 狠狠av | 亚洲一区二区久久 | 国产在线观看网站 | 伊人久久麻豆 | 久久一二区 | 综合久久网 | 91 在线| 国产美女自拍视频 | 中文字幕欧美日韩一区 | 精品国产视频 | 中文字幕高清一区 | 天堂中文av | 天天视频成人 | 成在线人视频免费视频 | 欧美久久久久 | av在线播放免费 | av永久 | 国产精品一级 | 91视频电影 | 国产成年人视频 | 免费亚洲一区二区 | 本道综合精品 | 久久大全| 欧美一区二区在线看 | 国产精品片aa在线观看 | 欧美一区不卡 | 国产精品久久久久久妇女6080 | 国产精品一区二 | 成人精品一区二区三区中文字幕 | 日韩中文字幕视频在线观看 | 国产成人精品一区二区三区 | 成人免费大片黄在线播放 | 国产精品大片 | 日韩一区二区在线免费观看 | 一区二区精品在线 | 欧美mv日韩mv国产网站91进入 |