偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

[[348531]]

什么是爬蟲?

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

爬蟲流程

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

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

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

Requests 使用

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

模擬發(fā)送 HTTP 請求

發(fā)送 GET 請求

當我們用瀏覽器打開豆瓣首頁時,其實發(fā)送的最原始的請求就是 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 對象

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

text:是以字符串的形式返回數(shù)據

content:是以二進制的方式返回數(shù)據

 

  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="豆瓣,廣播,登陸豆瓣">..... 

發(fā)送 POST 請求

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

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

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

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

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

BeautifulSoup

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

  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 節(jié)點 
  5. print(soup.p['class'])  # 獲取第一個 p 節(jié)點的 class 內容 
  6. print(soup.find_all('a'))  # 獲取文檔中所有的 a 節(jié)點,返回一個 list 
  7. print(soup.find_all('span', attrs={'style'"color:#ff0000"}))  # 獲取文檔中所有的 span 且 style 符合規(guī)則的節(jié)點,返回一個 list 

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

XPath 定位

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

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

一些簡單的例子

 

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

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

 

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

得到的 xpath 為

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

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

爬蟲實戰(zhàn):爬取豆瓣海報

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

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

 

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

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

目標網站頁面分析

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

Chrome 開發(fā)者工具

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

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

 

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

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

知道了這些規(guī)律后,我們就可以通過 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'

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

但是這里也只是一頁海報的數(shù)據,我們觀察頁面發(fā)現(xiàn)它有好多分頁,如何處理分頁呢。

 

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

分頁處理

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

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

發(fā)現(xiàn)瀏覽器 url 增加了幾個參數(shù)

再點擊第三頁,繼續(xù)觀察 url

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

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

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

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

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

 

  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 

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

 

  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 

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

 

  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 函數(shù),此時為了不是請求過于頻繁而影響豆瓣網的正常訪問,設置 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) 

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

 

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

核心代碼講解

下面再來看下完整的代碼

 

  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 函數(shù)

這是一個主執(zhí)行函數(shù),使用 range 函數(shù)來處理分頁。

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

get_poster_url 函數(shù)

這個就是解析 HTML 的函數(shù),使用的是 BeautifulSoup

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

download_picture 函數(shù)

簡易圖片下載器

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

總結

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

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

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

 

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

 

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

2009-12-11 09:04:10

Windows搭建Li

2021-06-16 09:02:43

Pythonjieba分詞Python基礎

2020-10-12 08:19:43

Python爬蟲網頁數(shù)據

2009-12-21 11:36:24

Linux啟動加密

2009-10-22 15:23:32

VB.NET函數(shù)

2021-12-09 10:24:47

Javascript 高階函數(shù)前端

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

2021-04-30 09:05:37

爬蟲框架數(shù)據

2021-05-08 08:04:05

Python爬取素材

2020-03-08 22:06:16

Python數(shù)據IP

2020-07-10 08:24:18

Python開發(fā)工具

2020-11-10 09:11:02

采集數(shù)據

2018-05-22 15:30:30

Python網絡爬蟲分布式爬蟲

2022-06-30 08:13:44

PythonWeb編程語言

2018-05-16 15:46:06

Python網絡爬蟲PhantomJS

2021-02-17 09:23:31

Python百度搜索

2025-04-01 01:35:00

NodeMySQL數(shù)據庫
點贊
收藏

51CTO技術棧公眾號