网络爬虫(一)——爬虫及其实现
文章目錄
- 1.1 爬蟲概述
- 1.1.3 網(wǎng)絡(luò)爬蟲和瀏覽器的區(qū)別
- 1.1.2 網(wǎng)絡(luò)爬蟲的定義
- 1.2 requests請(qǐng)求庫
- 1.2.1 requests基本概念
- 1.2.2 疫情數(shù)據(jù)爬取
- 1.2.3 get請(qǐng)求
- 1.2.4 headers請(qǐng)求頭
- 1.2.5 Cookies驗(yàn)證
- 1.3 Beautiful Soup解析庫
- 1.3.1 安裝
- 1.3.2 對(duì)象的創(chuàng)建
- 1.3.3 find方法
- 1.3.4 后話
- 1.4 正則表達(dá)式
- 1.4.1 正則表達(dá)式語法
- 1.4.2 re.findall()方法
- 1.4.3 r原串的使用
- 1.4.4 案例
- 1.5 json
- 1.5.1 json模塊
- 1.5.2 python轉(zhuǎn)json
- 1.5.3 案例
1.1 爬蟲概述
1.1.3 網(wǎng)絡(luò)爬蟲和瀏覽器的區(qū)別
瀏覽器和爬蟲都是在訪問網(wǎng)站的服務(wù)器,然后返回對(duì)應(yīng)的數(shù)據(jù)。不同的是,瀏覽器返回的數(shù)據(jù)還會(huì)經(jīng)過渲染,變成十分美觀的界面。而對(duì)于爬蟲來說,返回的一般是原生的HTML代碼。
1.1.2 網(wǎng)絡(luò)爬蟲的定義
網(wǎng)絡(luò)爬蟲也叫網(wǎng)絡(luò)蜘蛛或網(wǎng)絡(luò)機(jī)器人,其模擬客戶端發(fā)送網(wǎng)絡(luò)請(qǐng)求,獲取響應(yīng)數(shù)據(jù)。換而言之,它是一種按照一定的規(guī)則,自動(dòng)抓取萬維網(wǎng)信息的程序或腳本。
1.2 requests請(qǐng)求庫
1.2.1 requests基本概念
requests是一個(gè)優(yōu)雅而簡(jiǎn)單的pythonHTTP請(qǐng)求庫。它的作用是發(fā)送請(qǐng)求獲取響應(yīng)數(shù)據(jù)。如果你想要安裝這個(gè)庫,可以打開anaconda3的prompt黑窗口,然后在對(duì)應(yīng)的環(huán)境中輸入
pip install requests
安裝完成后,我們來試著返回一下百度搜索的源代碼
# 導(dǎo)入模塊 import requests# 發(fā)送請(qǐng)求,獲取響應(yīng) response = requests.get("https://www.baidu.com/")# 獲取響應(yīng)數(shù)據(jù) response.encoding = 'utf8' print(response.text)從以上的演示來看,我們可以從中總結(jié)requests使用的步驟:
- 導(dǎo)入模塊
- 發(fā)送get請(qǐng)求,獲取響應(yīng)
- 從響應(yīng)中獲取數(shù)據(jù)
這里還要給大家科普response對(duì)象的方法。
response.text:響應(yīng)體str類型
response.ecoding:二進(jìn)制轉(zhuǎn)換字符使用的編碼
response.content:響應(yīng)體bytes類型
1.2.2 疫情數(shù)據(jù)爬取
我們來試著爬取一下丁香園新型冠狀病毒疫情實(shí)時(shí)動(dòng)態(tài)首頁內(nèi)容。其url為:全球新冠肺炎疫情地圖 - 丁香園·丁香醫(yī)生 (dxy.cn)
# 導(dǎo)入模塊 import requests# 發(fā)送請(qǐng)求,獲取響應(yīng)對(duì)象 response = requests.get("http://ncov.dxy.cn/ncovh5/view/pneumonia")# 從響應(yīng)對(duì)象中獲取數(shù)據(jù) print(response.content.decode()) #print(response.text)1.2.3 get請(qǐng)求
對(duì)于get請(qǐng)求返回的響應(yīng)對(duì)象,實(shí)際上含有多種方法可調(diào)用。
- response.url:打印請(qǐng)求url
- response.headers:打印請(qǐng)求頭
- response.cookies:打印cookie信息
- response.status_code:打印請(qǐng)求狀態(tài)碼
對(duì)于狀態(tài)碼來說,有如下幾種情況:
1.2.4 headers請(qǐng)求頭
對(duì)于某些網(wǎng)頁,其實(shí)現(xiàn)了反爬機(jī)制,所有通過get方法無法獲取數(shù)據(jù)。這時(shí)候我們可以模擬瀏覽器的頭部信息來訪問。
每個(gè)瀏覽器的頭部信息不同。如何查看瀏覽器的頭部信息呢?
打開一個(gè)網(wǎng)頁,點(diǎn)檢查,然后刷新一下網(wǎng)頁,然后按照上圖操作即可找到頭部信息。
在使用get請(qǐng)求時(shí),只需在get方法的有參構(gòu)造中傳入對(duì)應(yīng)的請(qǐng)求頭即可。如下所示:
import requests# 瀏覽器頭部信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36 Edg/100.0.1185.29'} url = "http://ncov.dxy.cn/ncovh5/view/pneumonia"response = requests.get(url, headers=headers) print(response.status_code)1.2.5 Cookies驗(yàn)證
在爬取某些數(shù)據(jù)時(shí),需要進(jìn)行網(wǎng)頁的登錄,才可以進(jìn)行數(shù)據(jù)的抓取工作。Cookies登錄就像很多網(wǎng)頁中的自動(dòng)登錄功能一樣,可以讓用戶第二次登錄時(shí)在不需要驗(yàn)證賬號(hào)和密碼的情況下進(jìn)行登錄。在使用requests模塊實(shí)現(xiàn)Cookies登錄時(shí),首先需要在瀏覽器的開發(fā)者工具頁面中找到可以實(shí)現(xiàn)登錄的Cookies信息,然后將Cookies信息處理并添加至RequestsCookieJar的對(duì)象中,最后將RequestsCookieJar對(duì)象作為網(wǎng)絡(luò)請(qǐng)求的Cookies參數(shù)發(fā)送網(wǎng)絡(luò)請(qǐng)求即可。以獲取豆瓣網(wǎng)頁登錄后用戶名為例,具體步驟如下:
- 在Google瀏覽器中打開豆瓣網(wǎng)頁地址(https://www.douban.com/),并輸入自己的賬號(hào)+密碼登錄。
- 右鍵“檢查”,選擇“Network”選項(xiàng)。
- 在“name”框中選擇其中一個(gè),在Headers選項(xiàng)中選擇Request Headers選項(xiàng),獲取登錄后的Cookies信息(選中后右鍵“Copy value”)。
- 導(dǎo)入相應(yīng)的模塊,將復(fù)制出來的Cookie信息粘到下面的“此處填寫登錄后網(wǎng)頁的Cookie信息”中,然后創(chuàng)建RequestsCookieJar()對(duì)象并對(duì)Cookie信息進(jìn)行處理,最后將處理后的RequestsCookieJar()對(duì)象作為網(wǎng)絡(luò)請(qǐng)求參數(shù),實(shí)現(xiàn)網(wǎng)頁的登錄請(qǐng)求。
讓我們?cè)囈幌孪旅娴拇a:
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'} import requests #導(dǎo)入requests模塊cookies = '此處填寫登錄后網(wǎng)頁的Cookie信息' #發(fā)送網(wǎng)絡(luò)請(qǐng)求 url = 'https://www.douban.com' #創(chuàng)建requestsCookieJar對(duì)象,用于設(shè)置Cookies信息 cookies_jar = requests.cookies.RequestsCookieJar() for cookie in cookies.split(';'):key,value = cookie.split('=',1)cookies_jar.set(key,value) response = requests.get(url,headers=headers,cookies=cookies_jar) print(response.status_code) #打印相應(yīng)狀態(tài)碼 print(response.text) #打印相應(yīng)結(jié)果1.3 Beautiful Soup解析庫
Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的python庫。如果你不太懂HTML的相關(guān)知識(shí),我希望您參考一下我的HTML相關(guān)博客。
1.3.1 安裝
我們需要安裝兩個(gè)東西:bs4和lxml。
pip install bs4
pip install lxml
1.3.2 對(duì)象的創(chuàng)建
BeautifulSoup對(duì)象代表要解析的整個(gè)文檔樹。它支持搜索文檔樹和搜索文檔樹中描述的大部分方法。
我們來試著創(chuàng)建一個(gè)BeautifulSoup對(duì)象。解析時(shí),我們采用lxml解析器。
# 導(dǎo)入模塊 from bs4 import BeautifulSoup# 創(chuàng)建對(duì)象 soup = BeautifulSoup('<html>data</html>', 'lxml') print(soup)out:
<html><body><p>data</p></body></html>輸入結(jié)果時(shí)我們可以看到BeautifulSoup對(duì)象幫我們自動(dòng)補(bǔ)全了html的標(biāo)準(zhǔn)格式。
1.3.3 find方法
BeautifulSoup擁有find方法,其作用可以用于搜索文檔樹。
find(self,name = None,attr = [],recursive = True,text = None,**kwargs)
- name:標(biāo)簽名
- attrs:屬性字典
- recursive:是否遞歸循環(huán)查找,如果為False,則無法找到指定標(biāo)簽的子標(biāo)簽
- text:根據(jù)文本內(nèi)容查找
- return :查找到的第一個(gè)元素對(duì)象
- 如果想要找到所有元素對(duì)象,可以使用findAll方法
我們來試著利用bs4來解析以下的HTML語言。
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得體會(huì)——塵魚</title> </head> <body><h1>浮世三千</h1><hr><h2>文章內(nèi)容</h2><p>無非兩種人:一種是做了,沒成功,所以焦慮;一種是沒做,要迎接失敗了,所以焦慮。人常常會(huì)把自己的所得經(jīng)驗(yàn)告誡未得之人,就如同許久之前高中的恩師一般念叨;人常常會(huì)抱怨世間的不公,想要改變眼前的一切;而人在經(jīng)歷了大起大落后回望,他們總是能發(fā)現(xiàn):自己的付出不像童話里的那般美好,總能得到意外的對(duì)待。很少有些許的沉思,或者來自內(nèi)心深處的拷問:自己至此,該干什么,身邊的人說了那么多,自己該不該反思什么。致命的慵懶總是帶來成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解決的方法就像是時(shí)光隧道中那一絲薄弱的亮光微不可及;避開自己心里的拷問,避開一切的一切,似乎拖著拖著生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="圖片加載失敗" title="該圖片來源于塵魚好美" weight="480" height="360"><p>“日常所得焦慮,無非是三天打魚兩天曬網(wǎng),時(shí)而努力時(shí)而頹廢所致。”</p><p>約莫些許人同此言,卻又忘卻其 “人生的悲歡并不相同,他們只覺得你吵鬧。<br>棄浮沉往事,探前方長(zhǎng)路坎坷;棄勿須情感,奔自己心中所想。<br>繁瑣的慥詞現(xiàn)已無人愿細(xì)細(xì)品味,只愿將心中所得能與伯樂共享,足矣。</p>如果喜歡該案例可以關(guān)注我的網(wǎng)站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">點(diǎn)此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop> </body> </html>讓我們動(dòng)手試一下:
# 導(dǎo)入模塊 from bs4 import BeautifulSoup# HTML文檔對(duì)象 htmlTest = """<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得體會(huì)——塵魚</title> </head> <body><h1>浮世三千</h1><hr><h2>文章內(nèi)容</h2><p>無非兩種人:一種是做了,沒成功,所以焦慮;一種是沒做,要迎接失敗了,所以焦慮。人常常會(huì)把自己的所得經(jīng)驗(yàn)告誡未得之人,就如同許久之前高中的恩師一般念叨;人常常會(huì)抱怨世間的不公,想要改變眼前的一切;而人在經(jīng)歷了大起大落后回望,他們總是能發(fā)現(xiàn):自己的付出不像童話里的那般美好,總能得到意外的對(duì)待。很少有些許的沉思,或者來自內(nèi)心深處的拷問:自己至此,該干什么,身邊的人說了那么多,自己該不該反思什么。致命的慵懶總是帶來成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解決的方法就像是時(shí)光隧道中那一絲薄弱的亮光微不可及;避開自己心里的拷問,避開一切的一切,似乎拖著拖著生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="圖片加載失敗" title="該圖片來源于塵魚好美" weight="480" height="360"><p>“日常所得焦慮,無非是三天打魚兩天曬網(wǎng),時(shí)而努力時(shí)而頹廢所致。”</p><p>約莫些許人同此言,卻又忘卻其 “人生的悲歡并不相同,他們只覺得你吵鬧。<br>棄浮沉往事,探前方長(zhǎng)路坎坷;棄勿須情感,奔自己心中所想。<br>繁瑣的慥詞現(xiàn)已無人愿細(xì)細(xì)品味,只愿將心中所得能與伯樂共享,足矣。</p>如果喜歡該案例可以關(guān)注我的網(wǎng)站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">點(diǎn)此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop> </body> </html>"""# 創(chuàng)建對(duì)象 soup = BeautifulSoup(htmlTest, 'lxml')# 查找title標(biāo)簽 title = soup.find("title") # 查找a標(biāo)簽 a = soup.find("a") # 查找所有a標(biāo)簽 a_s = soup.findAll("a")print(title) print(a) print(a_s)我們也可以不通過標(biāo)簽查找內(nèi)容,而通過屬性查找內(nèi)容。那么我們可以使用find有參構(gòu)造器中attrs屬性來構(gòu)建屬性字典,從而進(jìn)行查找。如下所示:
# 導(dǎo)入模塊 from bs4 import BeautifulSoup# HTML文檔對(duì)象 htmlTest = """<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得體會(huì)——塵魚</title> </head> <body><h1>浮世三千</h1><hr><h2>文章內(nèi)容</h2><p>無非兩種人:一種是做了,沒成功,所以焦慮;一種是沒做,要迎接失敗了,所以焦慮。人常常會(huì)把自己的所得經(jīng)驗(yàn)告誡未得之人,就如同許久之前高中的恩師一般念叨;人常常會(huì)抱怨世間的不公,想要改變眼前的一切;而人在經(jīng)歷了大起大落后回望,他們總是能發(fā)現(xiàn):自己的付出不像童話里的那般美好,總能得到意外的對(duì)待。很少有些許的沉思,或者來自內(nèi)心深處的拷問:自己至此,該干什么,身邊的人說了那么多,自己該不該反思什么。致命的慵懶總是帶來成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解決的方法就像是時(shí)光隧道中那一絲薄弱的亮光微不可及;避開自己心里的拷問,避開一切的一切,似乎拖著拖著生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="圖片加載失敗" title="該圖片來源于塵魚好美" weight="480" height="360"><p>“日常所得焦慮,無非是三天打魚兩天曬網(wǎng),時(shí)而努力時(shí)而頹廢所致。”</p><p>約莫些許人同此言,卻又忘卻其 “人生的悲歡并不相同,他們只覺得你吵鬧。<br>棄浮沉往事,探前方長(zhǎng)路坎坷;棄勿須情感,奔自己心中所想。<br>繁瑣的慥詞現(xiàn)已無人愿細(xì)細(xì)品味,只愿將心中所得能與伯樂共享,足矣。</p>如果喜歡該案例可以關(guān)注我的網(wǎng)站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">點(diǎn)此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop> </body> </html>"""# 創(chuàng)建對(duì)象 soup = BeautifulSoup(htmlTest, 'lxml')# 根據(jù)title屬性查找img內(nèi)容 img = soup.find(attrs={'weight': "480"}) print(img)1.3.4 后話
實(shí)際上,解析庫不止有bs4,還有Xpath、selenium和Scrapy框架。這些后面我想單獨(dú)再講,這里有bs4已經(jīng)足夠爬取大部分的網(wǎng)頁內(nèi)容了。
1.4 正則表達(dá)式
1.4.1 正則表達(dá)式語法
正則表達(dá)式可以用于字符串匹配。其可以檢查一個(gè)字符串是否含有某種子串,還可以替換匹配的子串,最后還能提取某個(gè)字符串匯總匹配的子串。
讓我們來看一下正則表達(dá)式的語法。
| . | 匹配除換行符以外的任意字符 |
| \ | 轉(zhuǎn)義字符,能使的改變字符原本的意思,變?yōu)樽址?/td> |
| […] | 字符集。對(duì)應(yīng)的位置可以是字符集中任意字符。如a[a-c]d,那么其匹配結(jié)果是aad、abd、acd。如果要取反,加上^即可。如a[ ^a-c ],其可以匹配除了aa、ab、ac以外的任何帶a開頭的兩位英文字符串。 |
動(dòng)手試一下吧,能夠加深你的印象。
# 正則表達(dá)式的常見語法 import re# 字符匹配 str1 = 'abcdefg' rs = re.findall('abc', str1) rs1 = re.findall('a.c', str1) print(f"字符串匹配結(jié)果{rs}") print(f"點(diǎn)的匹配結(jié)果{rs1}") str2 = 'a.bcdfg' rs2 = re.findall('a\..c', str2) print(f"用轉(zhuǎn)義字符匹配點(diǎn){rs2}") rs3 = re.findall('a[bc]c', str1) print(f"用字符集匹配{rs3}")對(duì)于字符集來說,里面可以填上一些字符。
| \d | 匹配數(shù)字0-9 |
| \D | 匹配^\d |
| \s | 匹配空白字符 |
| \S | 匹配非空白字符 |
| \w | 匹配普通字符,相當(dāng)于[A-Za-z0-9_] |
| \W | 匹配非英語字母 |
除了以上的字符之外,還有一些數(shù)量詞。它們一般用于字符或字符集之后。
| * | 匹配前一個(gè)字符0或無限次 | abc* | ab,abccc |
| + | 匹配前一個(gè)字符1次或無限次 | abc+ | abc,abccc |
| ? | 匹配前一個(gè)字符0次或1次 | acb? | ab,abc |
| {m} | 匹配前一個(gè)字符m次 | ab{2}c | abbc |
1.4.2 re.findall()方法
re.findall(pattern,string,flag = 0)
- 掃描整個(gè)string字符串,返回所有與pattern匹配的列表
- pattern:正則表達(dá)式
- string:從那個(gè)字符串中尋找
- flags:匹配模式
在上面的操作中,我們使用小括號(hào)進(jìn)行分組,其中分組是用于返回括號(hào)內(nèi)匹配的結(jié)果,如果不加分組則返回整個(gè)字符串;當(dāng)加了分組后,小括號(hào)兩旁的字符串是用于定位的。
1.4.3 r原串的使用
在我們不使用r原串時(shí),如果我們想要匹配轉(zhuǎn)義符怎么匹配?我們需要四個(gè)斜桿。即如果想用正則表達(dá)式匹配\,則需要\\\\。
對(duì)于re模塊來說,其為我們提供了r原串來解決上述的問題。我們來看一下下面的例子:
import re# 1 不使用r原串,遇到轉(zhuǎn)義符怎么辦 rs = re.findall('a\\\nbc', 'a\nbc') print(rs)# 2 使用r原串 rs = re.findall(r'a\nbc', 'a\nbc') print(rs)1.4.4 案例
讓我們來試著利用所學(xué)知識(shí)提取一下疫情的json字符串,注意,這里可能還有人不認(rèn)識(shí)json是什么,下一講我們會(huì)做闡述,這里我們應(yīng)該關(guān)注的是,如何爬蟲和如何正則匹配。
鏈接:全球新冠肺炎疫情地圖 - 丁香園·丁香醫(yī)生 (dxy.cn)
import requests from bs4 import BeautifulSoup import re# 1 獲取首頁內(nèi)容 # 發(fā)送請(qǐng)求,獲取響應(yīng) response = requests.get('http://ncov.dxy.cn/ncovh5/view/pneumonia') # 從響應(yīng)中獲取數(shù)據(jù) page = response.content.decode()# 2 提取各國疫情數(shù)據(jù) # 構(gòu)建bs對(duì)象 soup = BeautifulSoup(page, 'lxml') # 查找標(biāo)簽 script = soup.find(id='getListByCountryTypeService2true') # 獲取標(biāo)簽內(nèi)容 countries_text = script.text # 提取json字符串 json_str = re.findall(r"(\[.*\])", countries_text) print(json_str)1.5 json
1.5.1 json模塊
JSON全名JavaScript Object Notation(JavaScript 對(duì)象表示法),它是存儲(chǔ)和交換文本信息的語法,類似 XML。JSON 比 XML 更小、更快,更易解析。其和python數(shù)據(jù)類型區(qū)別如下:
我們來看一段json的文件:
{"sites": [{ "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" }] }python中提供了json模塊,其可用于json格式的文件數(shù)據(jù)和python文件數(shù)據(jù)的相互轉(zhuǎn)換。
如何實(shí)現(xiàn)裝換呢?如果我們是要是json字符串轉(zhuǎn)化為python類型數(shù)據(jù)的話,只需調(diào)用json.load(),將字符串傳給構(gòu)造器即可。
同樣地,如果你想將json文件轉(zhuǎn)為python類型的數(shù)據(jù),那么首先要實(shí)例化json文件,讓其變?yōu)閷?duì)象,然后再將對(duì)象傳入json.load()的構(gòu)造器中。
import json# 1 把json字符串轉(zhuǎn)換為python數(shù)據(jù) json_str = """{"sites": [{ "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" }] }"""rs = json.loads(json_str) # print(rs)# 2 把json格式文件轉(zhuǎn)換為python類型的數(shù)據(jù) with open('Test.json') as fp:python_list = json.load(fp)print(python_list)1.5.2 python轉(zhuǎn)json
轉(zhuǎn)換原理如下所示:
import json# 1 python數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù) # json轉(zhuǎn)python json_str = """{"sites": [{ "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" }] }""" rs = json.loads(json_str) # print(rs)# python轉(zhuǎn)json json_str = json.dumps(rs, ensure_ascii=False) # print(json_str)# 2 把python以json格式存儲(chǔ)到文件中 with open('test.json', 'w') as fp:json.dump(rs, fp, ensure_ascii=False)1.5.3 案例
讓我們繼續(xù)1.4.4中json字符串轉(zhuǎn)換為python的過程。
import json import requests from bs4 import BeautifulSoup import re# 1 獲取首頁內(nèi)容 # 發(fā)送請(qǐng)求,獲取響應(yīng) response = requests.get('http://ncov.dxy.cn/ncovh5/view/pneumonia') # 從響應(yīng)中獲取數(shù)據(jù) page = response.content.decode()# 2 提取各國疫情數(shù)據(jù) # 構(gòu)建bs對(duì)象 soup = BeautifulSoup(page, 'lxml') # 查找標(biāo)簽 script = soup.find(id='getListByCountryTypeService2true') # 獲取標(biāo)簽內(nèi)容 countries_text = script.text # 提取json字符串 json_str = re.findall(r"\[.*\]", countries_text)[0] print(json_str)# 3 把json字符串轉(zhuǎn)換為python類型數(shù)據(jù) last_day_corona_virus = json.loads(json_str) print(last_day_corona_virus)總結(jié)
以上是生活随笔為你收集整理的网络爬虫(一)——爬虫及其实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net 强制性单一登陆现实
- 下一篇: 学习笔记-java编程-交通灯管理器设计