亚洲av中文无码乱人伦在线视色,网曝黑料国产吃瓜,无码国产精品久久一区免费,亚洲av在在线观看,亚洲av国产午夜精品一区二区

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

編程不是科學(xué),而是一門手藝

Python 具有豐富的解析庫(kù)和簡(jiǎn)潔的語(yǔ)法,所以很適合寫(xiě)爬蟲(chóng)。這里的爬蟲(chóng)指的是爬取網(wǎng)頁(yè)的“蟲(chóng)子”。簡(jiǎn)而言之,爬蟲(chóng)就是模擬瀏覽器訪問(wèn)網(wǎng)頁(yè),然后獲取內(nèi)容的程序。

爬蟲(chóng)工程師是個(gè)很重要的崗位。爬蟲(chóng)每天爬取數(shù)以億計(jì)的網(wǎng)頁(yè),供搜索引擎使用。爬蟲(chóng)工程師們當(dāng)然不是通過(guò)單擊鼠標(biāo)右鍵并另存的方式來(lái)爬取網(wǎng)頁(yè)的,而會(huì)用爬蟲(chóng)“偽裝”成真實(shí)用戶,去請(qǐng)求各個(gè)網(wǎng)站,爬取網(wǎng)頁(yè)信息。

本文選自《Python基礎(chǔ)視頻教程》一書(shū),每一小節(jié)都給出了視頻講解,配合視頻微課帶你快速入門Python。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)


( 正 文 )

1、初識(shí) HTTP :4行代碼寫(xiě)一個(gè)爬蟲(chóng)

超文本傳輸協(xié)議(HyperText Transfer Protocol,HTTP)是網(wǎng)絡(luò)中最常見(jiàn)的網(wǎng)絡(luò)傳輸協(xié)議。常見(jiàn)網(wǎng)站的網(wǎng)址大都以 http 開(kāi)頭或者以 https 開(kāi)頭,https 在 http 基礎(chǔ)上做了一層加密的協(xié)議。

通常情況下,在瀏覽器里給服務(wù)器發(fā)送 http 或 https 請(qǐng)求,服務(wù)器拿到請(qǐng)求后會(huì)向?yàn)g覽器返回相應(yīng)的結(jié)果(response),瀏覽器解析、潤(rùn)色后呈現(xiàn)給用戶。

寫(xiě)爬蟲(chóng)沒(méi)有那么難,下面用 4 行代碼寫(xiě)一個(gè)爬蟲(chóng)。在 first_spider.py 文件中寫(xiě)入以下代碼:

1from urllib import request
2page = request.urlopen('http://www.yuqiaochuang.com/')
3ret = page.read()
4print(ret)

python first_spider.py 運(yùn)行后,會(huì)看到屏幕上打印出了頁(yè)面的源代碼,這短短 4行就是一個(gè)爬蟲(chóng)。

從本質(zhì)上來(lái)說(shuō),這和打開(kāi)瀏覽器、輸入網(wǎng)址去訪問(wèn)沒(méi)有什么區(qū)別,只不過(guò)后者是借助瀏覽器獲取頁(yè)面內(nèi)容,而爬蟲(chóng)則是用原生的 HTTP 獲取內(nèi)容。屏幕上打印的源代碼和在 Chrome 瀏覽器中單擊鼠標(biāo)右鍵,然后在彈出的快捷菜單中單擊“查看網(wǎng)頁(yè)源代碼”是一樣的。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

在此可以看到,網(wǎng)頁(yè)的源代碼是由很多標(biāo)簽組成的。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

尖括號(hào)包圍的就是一個(gè)標(biāo)簽,如<head><body><div>。標(biāo)簽內(nèi)可以有屬性,例如<html lang="zh-CN">,有一個(gè)值為"zh-CN"的 lang 屬性,表示語(yǔ)言是中文。標(biāo)簽通常是成對(duì)出現(xiàn)的,例如,<title>Python 教程 – 雨敲窗個(gè)人博客</title>?!癙ython 教程 – 雨敲窗個(gè)人博客”被<title>和</title>包括起來(lái),包括起來(lái)的部分被稱為標(biāo)簽的內(nèi)容。

2、正則表達(dá)式

前面用 4 行代碼寫(xiě)了一個(gè)爬蟲(chóng),運(yùn)行成功后可以看到爬取的內(nèi)容。不過(guò),這卻是一個(gè)大塊的內(nèi)容,如果想提取其中的某些字段該怎么辦?

常用的做法就是用正則表達(dá)式(Regular Expression)提取。

對(duì)初學(xué)編程的人來(lái)說(shuō),很難理解正則表達(dá)式是“何方神圣”。其實(shí)大家可以把正則表達(dá)式當(dāng)作一個(gè)提取器來(lái)看,通過(guò)制定一些規(guī)則,從字符串中提取出想要的內(nèi)容。

下面先看看正則表達(dá)式的幾個(gè)簡(jiǎn)單用法。在regular_expression.py 文件中寫(xiě)入以下代碼:

1import re # 正則表達(dá)式的包
2
3m = re.findall("abc", "aaaaabcccabcc")
4print(m)
5m = re.findall("d", "abc1ab2c")
6print(m)
7m = re.findall("dddd", "123abc1234abc")
8print(m)
9m = re.findall(r"<div>(.*)</div>", "<div>hello</div>")
10print(m)
11m = re.findall(r"<div>(.*)</div>", "<div>hello</div><div>world</div>")
12print(m)
13m = re.findall(r"<div>(.*?)</div>", "<div>hello</div><div>world</div>")
14print(m)

python regular_expression.py 的運(yùn)行結(jié)果如下:

1['abc', 'abc']
2['1', '2']
3['1234']
4['hello']
5['hello</div><div>world']
6['hello', 'world']

首先,需要“import re”,以引用正則表達(dá)式模塊,這樣才能使用正則表達(dá)式庫(kù)中的方法。

之后,上述代碼中的 m = re.findall("abc", "aaaaabcccabcc") 從"aaaaabcccabcc"中提取出"abc",返回的 m 是一個(gè)列表,里面有兩個(gè)'abc'。

m = re.findall("d", "abc1ab2c") 從"abc1ab2c"中提取出單個(gè)數(shù)字,"d"表示提取的目標(biāo)字符是數(shù)字,返回的結(jié)果是['1', '2'] 。

m = re.findall("dddd", "123abc1234abc")提取 4 個(gè)連續(xù)的數(shù)字,返回的結(jié)果是['1234']。

m = re.findall(r"<div>(.*)</div>", "<div>hello</div>")從"<div>hello</div>"中提取出<div>和</div>中間的內(nèi)容,括號(hào)括起來(lái)就表示提取括號(hào)中的內(nèi)容,“.”表示可以匹配任何字符,“*”表示可以匹配任意多個(gè)字符,返回的結(jié)果是['hello']。

m = re.findall(r"<div>(.*)</div>", "<div>hello</div><div>world</div>")從"<div> hello</div><div>world</div>" 中 取 div 中 的 內(nèi) 容 , 返 回 的 結(jié) 果 是 ['hello</div> <div>world']。與上一行的提取規(guī)則相同,為什么沒(méi)有單獨(dú)提取出 hello 和 world 呢?因?yàn)檎齽t表達(dá)式默認(rèn)用的是貪婪匹配,所謂貪婪匹配就是能匹配多長(zhǎng)就匹配多長(zhǎng)。"<div>hello</div><div>world</div>"就從頭匹配到了末尾,提取出來(lái)一個(gè)大長(zhǎng)串。

m = re.findall(r"<div>(.*?)</div>", "<div>hello</div><div>world</div>") 在括號(hào)中加入一個(gè)“?”就表示以非貪婪匹配去提取,即能匹配多短就匹配多短,所以提取出來(lái)的結(jié)果是['hello', 'world']。

結(jié)合前面的幾個(gè)例子,可以總結(jié)出正則表達(dá)式中最常用的 findall 方法的用法。第一個(gè)參數(shù)是定義的提取語(yǔ)法,第二個(gè)參數(shù)是原始字符串。返回的是一個(gè)列表,列表里是符合提取規(guī)則的字符串。

關(guān)于正則表達(dá)式更詳細(xì)的語(yǔ)法,大家可以借助搜索引擎,搜索“菜鳥(niǎo)教程正則表達(dá)式”。

3、爬取靜態(tài)頁(yè)面的網(wǎng)站

還 記 得 前 面 寫(xiě) 的 那 個(gè) 只 有 4 行 碼 的 爬 蟲(chóng) 嗎 ?它 爬 取 了 “ http://www. yuqiaochuang.com”整個(gè)頁(yè)面的內(nèi)容。在學(xué)過(guò)正則表達(dá)式之后,就可以提取想要的內(nèi)容。

還是以爬取這個(gè)博客為例,提取這個(gè)博客上文章列表的標(biāo)題。

在爬取一個(gè)網(wǎng)站前,通常要先分析一下這個(gè)網(wǎng)站是否是靜態(tài)頁(yè)面。靜態(tài)頁(yè)面是指,網(wǎng)站的源代碼里包含所有可見(jiàn)的內(nèi)容,也就是所見(jiàn)即所得。常用的做法是,在瀏覽器中單擊鼠標(biāo)右鍵,然后在彈出的快捷菜單中選擇“顯示網(wǎng)頁(yè)源代碼”,推薦使用 Chrome 瀏覽器。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

類似上圖中的代碼,就是網(wǎng)頁(yè)的源代碼,這里能夠看到該博客中文章的標(biāo)題和網(wǎng)址。

接下來(lái)使用正則表達(dá)式提取各標(biāo)題。前面那個(gè)只有 4 行代碼的爬蟲(chóng)用的是標(biāo)準(zhǔn)庫(kù)里的urllib 庫(kù)。推薦使用 requests 庫(kù),其具有更強(qiáng)大、更易用的功能。使用 pip 安裝,在 PowerShell 命令行窗口中輸入以下命令:

1pip install requests

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

上述代碼的前兩行先將要使用的庫(kù)“import”進(jìn)來(lái),然后調(diào)用 requests 庫(kù)中的 get方法獲取頁(yè)面(page)。之后使用 re.findall 方法提取所有的標(biāo)題,page.text 即頁(yè)面的源代碼內(nèi)容。將頁(yè)面中以“<p><a.*>”開(kāi)頭、“</a></p>”結(jié)尾的標(biāo)題提取出來(lái)。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

若欲了解更多與 requests 庫(kù)相關(guān)的資料,可以借助搜索引擎,搜索“python requests”查看具體用法。

4、beautifulsoup4

beautifulsoup4 也是一個(gè) Python 的第三方庫(kù),提供解析網(wǎng)頁(yè)的功能。其有些類似于正則表達(dá)式,但是比正則表達(dá)式的語(yǔ)法更加優(yōu)雅和便利。

在 PowerShell 命令行窗口中輸入以下命令安裝 beautifulsoup4:

1pip install beautifulsoup4

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

還是以“http://www.yuqiaochuang.com”的網(wǎng)頁(yè)源代碼為例,提取這些文章的標(biāo)題和鏈接。在 blog_spider_use_bs4.py 文件中寫(xiě)入以下代碼:

1from bs4 import BeautifulSoup
2import requests
3page = requests.get('http://www.yuqiaochuang.com/')
4soup = BeautifulSoup(page.text, features="html.parser")
5all_title = soup.find("div", "entry-content").find_all("a")
6for title in all_title:
7 print(title["href"], title.string)

“from bs4 import BeautifulSoup ”將 BeautifulSoup 引 進(jìn) 程 序 。

“ soup = BeautifulSoup(page.text, features="html.parser")”聲明了一個(gè)解析結(jié)構(gòu) soup。這里解析的是爬取的網(wǎng)頁(yè)源代碼 page.text;features 指定了“html.parser”這個(gè)默認(rèn)的解析器。

在此可以看到,想爬取的標(biāo)題都在 class 是“entry-content”的 div 塊中。“soup.find("div", "entry-content")”用于提取 class 是“entry-content”的 div 塊。緊接著調(diào)用 find_all,爬取所有標(biāo)題的標(biāo)簽。find_all 方法返回的是一個(gè)列表,這個(gè)列表中的元素是符合查找條件的標(biāo)簽。

然后寫(xiě)一個(gè)循環(huán),把標(biāo)題的標(biāo)簽打印下來(lái)。通過(guò)調(diào)用 title["href"]可以獲取標(biāo)簽中屬性的值—鏈接。title.string 則是獲取標(biāo)簽中的內(nèi)容。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

5、爬取圖片

如果網(wǎng)站中僅有枯燥的文字,則很難吸引用戶持續(xù)觀看,所以,好的網(wǎng)站都是圖文并茂的。如果想將圖片也爬取下來(lái),該怎么辦呢?爬蟲(chóng)當(dāng)然也可以爬取圖片,就像在用瀏覽器訪問(wèn)網(wǎng)站時(shí),可以在圖片上單擊鼠標(biāo)右鍵,然后在彈出的快捷菜單中選擇“另存為”選項(xiàng)去下載圖片一樣。

利用 requests 庫(kù)也可以抓取圖片。還是以爬取“http://www.yuqiaochuang.com”為例,這次爬取網(wǎng)站左上角的圖片。在左上角的圖片上面單擊鼠標(biāo)右鍵,接著在彈出的快捷菜單中選擇“檢查”。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

在此可以看到,瀏覽器下方區(qū)域出現(xiàn)了一個(gè)工具欄,里面突出顯示的部分就是圖片地址的網(wǎng)頁(yè)源代碼。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

在此可以看到,圖片是以“img”標(biāo)簽開(kāi)頭的。這個(gè)“img”標(biāo)簽在 class 是“profile”的 div 中,因此可以使用 requests beautifulsoup4 提取圖片的地址。

在 image_spider.py文件中寫(xiě)入以下代碼:

1from bs4 import BeautifulSoup
2import requests
3
4page = requests.get('http://www.yuqiaochuang.com/')
5soup = BeautifulSoup(page.text, features="html.parser")
6img = soup.find("div", "profile").find("img")
7print(img["src"])

python image_spider.py 的運(yùn)行結(jié)果如圖下。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

soup.find("div", "profile").find("img") 直接提取了 img 標(biāo)簽,然后打印 img 標(biāo)簽中的 src 字段,在此可以看到圖片地址被提取了出來(lái)。但是,你有沒(méi)有發(fā)現(xiàn)這個(gè)鏈接地址似乎少了一些前綴?

沒(méi)錯(cuò),少了"http://www.yuqiaochuang.com"。有些網(wǎng)站的圖片會(huì)省略前綴,在爬取時(shí)補(bǔ)上即可。接下來(lái)正式爬取圖片,在 image_spider.py 文件中寫(xiě)入以下代碼:

1from bs4 import BeautifulSoup
2import requests
3
4page = requests.get('http://www.yuqiaochuang.com/')
5soup = BeautifulSoup(page.text, features="html.parser")
6img = soup.find("div", "profile").find("img")
7
8image_url = "http://www.yuqiaochuang.com" img["src"]
9img_data = requests.get(image_url)
10img_file = "image.png"
11
12f = open(img_file, 'wb')
13f.write(img_data.content)
14f.close()

python image_spider.py 運(yùn)行后,可以看到當(dāng)前文件夾下多了一個(gè)“image.png”圖片文件。

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

在獲取圖片地址后,調(diào)用 requests 的 get 方法,獲取圖片的請(qǐng)求數(shù)據(jù),然后調(diào)用寫(xiě)文件的方法,將圖片數(shù)據(jù)寫(xiě)入到文件中。

前面爬取文字時(shí),調(diào)用的是 text 字段,為什么這里變成了 content 字段呢?

這是因?yàn)?content 是最原始的數(shù)據(jù),二進(jìn)制的數(shù)據(jù)流;而 text 則是經(jīng)過(guò)編碼的數(shù)據(jù)。在寫(xiě)文件時(shí),參數(shù)也不是'w',而是'wb'。'wb'的意思是,寫(xiě)入的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)流,而不是經(jīng)過(guò)編碼的數(shù)據(jù)。爬取圖片和爬取文字的本質(zhì),都是根據(jù)網(wǎng)頁(yè)鏈接發(fā)送請(qǐng)求,然后獲取內(nèi)容,只不過(guò)圖片需要用二進(jìn)制的形式保存到本地文件中。

—— 完 ——

對(duì)編程充滿向往和好奇,卻不知如何上手嗎?

博文視點(diǎn)學(xué)院精品課程【每天5分鐘:Python基礎(chǔ)視頻教程(書(shū) 課)】帶你打開(kāi)編程世界的大門!

5分鐘輕松學(xué)Python:4行代碼寫(xiě)一個(gè)爬蟲(chóng)(編寫(xiě)一段python爬蟲(chóng)代碼)

今日僅需39元,你將獲得:

  • 300分鐘、46節(jié)視頻講解
  • 社群答疑,同行交流,互助成長(zhǎng)
  • 價(jià)值59元的《Python基礎(chǔ)視頻教程》圖書(shū)一本

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢
返回頂部