日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

python爬虫基础(一)~爬虫概念和架构

發(fā)布時(shí)間:2025/4/5 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫基础(一)~爬虫概念和架构 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

1. 爬蟲(chóng)

1.1 概念

1.2 分類

2. 爬蟲(chóng)架構(gòu)

2.1 url管理器

2.2 網(wǎng)頁(yè)(html)下載(download)器

2.2.1 urllib下載html源碼

2.2.2 requests下載html源碼

2.3 網(wǎng)頁(yè)(html)解析(parser)器

2.3.1 BeautifulSoup解析包

2.3.2 xpath解析包

2.4 數(shù)據(jù)存儲(chǔ)器

2.4.1 保存文本

2.4.2 保存圖片

2.4.3 保存表格table數(shù)據(jù)

2.4.4?將數(shù)據(jù)重復(fù)寫入已存在的excel文件

3. 爬蟲(chóng)難點(diǎn)要點(diǎn)

3.1 設(shè)置headers

3.2 字符編解碼知識(shí)

3.3?爬取動(dòng)態(tài)頁(yè)面?

3.4?爬蟲(chóng)爬取的圖片損壞、無(wú)法打開(kāi)

3.5 異常處理

3.6 如何獲取兩個(gè)不同之間的所有文本

參考


1. 爬蟲(chóng)

1.1 概念

參考:百度百科~爬蟲(chóng)

網(wǎng)絡(luò)爬蟲(chóng)(又稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取html網(wǎng)頁(yè)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動(dòng)索引、模擬程序或者蠕蟲(chóng)。

1.2 分類

  • 通用網(wǎng)絡(luò)爬蟲(chóng)。又稱全網(wǎng)爬蟲(chóng)(Scalable Web Crawler),爬行對(duì)象從一些種子 URL 擴(kuò)充到整個(gè) Web,主要為門戶站點(diǎn)搜索引擎和大型 Web 服務(wù)提供商采集數(shù)據(jù)。?商業(yè)應(yīng)用,很少個(gè)人使用
  • 聚焦網(wǎng)絡(luò)爬蟲(chóng)(Focused Crawler)。又稱主題網(wǎng)絡(luò)爬蟲(chóng)(Topical Crawler),是指選擇性地爬行那些與預(yù)先定義好的主題相關(guān)頁(yè)面的網(wǎng)絡(luò)爬蟲(chóng)。我們通常意義上說(shuō)的爬蟲(chóng),給定詞或者url,爬取想要的網(wǎng)頁(yè)內(nèi)容。--我認(rèn)為是個(gè)人初級(jí)爬蟲(chóng)
  • 增量式網(wǎng)絡(luò)爬蟲(chóng)(Incremental Web Crawler)。是指對(duì)已下載網(wǎng)頁(yè)采取增量式更新和只爬行新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁(yè)的爬蟲(chóng),它能夠在一定程度上保證所爬行的頁(yè)面是盡可能新的頁(yè)面。針對(duì)特定網(wǎng)頁(yè),及時(shí)發(fā)現(xiàn)、爬取更新信息,?并可以發(fā)送郵件通知用戶。---我認(rèn)為是個(gè)人中級(jí)爬蟲(chóng)
  • Deep Web 爬蟲(chóng)Web 頁(yè)面按存在方式可以分為表層網(wǎng)頁(yè)(Surface Web)和深層網(wǎng)頁(yè)(Deep Web,也稱 Invisible Web Pages 或 Hidden Web)。 表層網(wǎng)頁(yè)是指?jìng)鹘y(tǒng)搜索引擎可以索引的頁(yè)面,以超鏈接可以到達(dá)的靜態(tài)網(wǎng)頁(yè)為主構(gòu)成的 Web 頁(yè)面。Deep Web 是那些大部分內(nèi)容不能通過(guò)靜態(tài)鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關(guān)鍵詞才能獲得的 Web 頁(yè)面。例如那些用戶注冊(cè)后內(nèi)容才可見(jiàn)的網(wǎng)頁(yè)就屬于 Deep Web。 2000 年 Bright Planet 指出:Deep Web 中可訪問(wèn)信息容量是 Surface Web 的幾百倍,是互聯(lián)網(wǎng)上最大、發(fā)展最快的新型信息資源。

2. 爬蟲(chóng)架構(gòu)

用python3!python3!python3!python2已經(jīng)過(guò)時(shí)了

2.1 url管理器

管理將要爬取的url和已經(jīng)爬取的url,將待爬取的url傳送給網(wǎng)頁(yè)下載器。

2.2 網(wǎng)頁(yè)(html)下載(download)器

將url指定的網(wǎng)頁(yè)下載下來(lái),保存為一個(gè)json字符串,然后將這個(gè)字符串傳送給html解析器解析。

download packages:requests,?urllib

html download包含三個(gè)核心部分:

  • 構(gòu)造url請(qǐng)求對(duì)象
  • 發(fā)送url請(qǐng)求,獲取響應(yīng)
  • 讀取/下載html全部網(wǎng)頁(yè)內(nèi)容

2.2.1 urllib下載html源碼

# 訪問(wèn)、下載html網(wǎng)頁(yè)url = 'https://baike.baidu.com/item/' + urllib.parse.quote(content) # 請(qǐng)求地址# 請(qǐng)求頭部,偽造瀏覽器,防止爬蟲(chóng)被反headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}# 利用請(qǐng)求地址和請(qǐng)求頭部構(gòu)造請(qǐng)求對(duì)象req = urllib.request.Request(url=url, headers=headers, method='GET')response = urllib.request.urlopen(req) # 發(fā)送請(qǐng)求,獲得響應(yīng)text = response.read().decode('utf-8') # 讀取響應(yīng),獲得文本

urllib.parse.quote(content) <--因?yàn)閡rl只允許一部分ascii字符,其他字符(如漢子)是不符合標(biāo)準(zhǔn)的,此時(shí)就要進(jìn)行編碼。
urllib.request.Request --> urlopen()方法可以實(shí)現(xiàn)最基本構(gòu)造HTTP請(qǐng)求的方法,但如果加入headers等信息,就可以利用Request類來(lái)構(gòu)造請(qǐng)求。

2.2.2 requests下載html源碼

#coding=utf-8 import requests from bs4 import BeautifulSoupresp=requests.get('https://www.baidu.com') #請(qǐng)求百度首頁(yè) print(resp) #打印請(qǐng)求結(jié)果的狀態(tài)碼 print(resp.content) #打印請(qǐng)求到的網(wǎng)頁(yè)源碼bsobj=BeautifulSoup(resp.content,'lxml') #將網(wǎng)頁(yè)源碼構(gòu)造成BeautifulSoup對(duì)象,方便操作 a_list=bsobj.find_all('a') #獲取網(wǎng)頁(yè)中的所有a標(biāo)簽對(duì)象 text='' # 創(chuàng)建一個(gè)空字符串 for a in a_list:href=a.get('href') #獲取a標(biāo)簽對(duì)象的href屬性,即這個(gè)對(duì)象指向的鏈接地址text+=href+'\n' #加入到字符串中,并換行 with open('url.txt','w') as f: #在當(dāng)前路徑下,以寫的方式打開(kāi)一個(gè)名為'url.txt',如果不存在則創(chuàng)建f.write(text) #將text里的數(shù)據(jù)寫入到文本中

-->注意:百度爬取的html有靜態(tài)頁(yè)面和動(dòng)態(tài)頁(yè)面。靜態(tài)簡(jiǎn)單,比如百度百科;動(dòng)態(tài)困難,比如淘女郎,參考:https://blog.csdn.net/aaronjny/article/details/80291997

2.3 網(wǎng)頁(yè)(html)解析(parser)器

一方面,html parser會(huì)解析出有價(jià)值的數(shù)據(jù);另一方面,解析出字符串中的url,將其補(bǔ)充到url管理器。這三個(gè)模塊形成了一個(gè)循環(huán),只要有未爬取的url,這個(gè)循環(huán)就會(huì)一直繼續(xù)下去。

parser packages:?bs4, lxml, xpath。正則表達(dá)式用于提取解析器提取不到的數(shù)據(jù)!!!

html parser包含三個(gè)核心內(nèi)容

  • 解析html內(nèi)容
  • 抽取特定標(biāo)簽,返回一個(gè)標(biāo)簽列表
  • 獲取標(biāo)簽文本/屬性值

2.3.1 BeautifulSoup解析包

將網(wǎng)頁(yè)源碼解析成BeautifulSoup對(duì)象,方便操作

抽取標(biāo)簽方法:find()方法、find_all()方法、select()方法

獲取標(biāo)簽文本、屬性值方法:text()方法、get_text()方法、get()方法

具體方法介紹,看我的第二篇博客:python爬蟲(chóng)基礎(chǔ)(二)~工具包: 下載包requests、urllib和解析包BeautifulSoup(bs4)、xpath,https://blog.csdn.net/qq_33419476/article/details/117394430

# 爬取圖片# 找到所有img標(biāo)簽,返回一個(gè)url的標(biāo)簽列表img_urllist = []resp = requests.get(url=url, headers=headers)content = resp.contentsoup = BeautifulSoup(content, 'lxml')# img_list = soup.select('div .album-wrap')img_list = soup.select('a>div>img')print(img_list)for img in img_list:try:# src = img.find('img').get('src')src = img.get('src')if re.match(r'https:(.*)image(.*)auto$', src):img_urllist.append(src)except:continue

2.3.2 xpath解析包

def query(content):# 請(qǐng)求地址url = 'https://baike.baidu.com/item/' + urllib.parse.quote(content)# 請(qǐng)求頭部headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}# 利用請(qǐng)求地址和請(qǐng)求頭部構(gòu)造請(qǐng)求對(duì)象req = urllib.request.Request(url=url, headers=headers, method='GET')# 發(fā)送請(qǐng)求,獲得響應(yīng)response = urllib.request.urlopen(req)# 讀取響應(yīng),獲得文本text = response.read().decode('utf-8')# 構(gòu)造 _Element 對(duì)象html = etree.HTML(text)# 使用 xpath 匹配數(shù)據(jù),得到匹配字符串列表sen_list = html.xpath('//div[contains(@class,"lemma-summary")]//text()')print(sen_list)# 過(guò)濾數(shù)據(jù),去掉空白sen_list_after_filter = [item.strip('\n') for item in sen_list if item != '\n']# 將字符串列表連成字符串并返回return ''.join(sen_list_after_filter)

2.4 數(shù)據(jù)存儲(chǔ)器

2.4.1 保存文本

  • 寫入--"w"; 追加--"a"

source:菜鳥(niǎo)教程,https://www.runoob.com/python/python-func-open.html

模式描述
t文本模式 (默認(rèn))。
x寫模式,新建一個(gè)文件,如果該文件已存在則會(huì)報(bào)錯(cuò)。
b二進(jìn)制模式。
+打開(kāi)一個(gè)文件進(jìn)行更新(可讀可寫)。
U通用換行模式(不推薦)。
r以只讀方式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭。這是默認(rèn)模式。
rb以二進(jìn)制格式打開(kāi)一個(gè)文件用于只讀。文件指針將會(huì)放在文件的開(kāi)頭。這是默認(rèn)模式。一般用于非文本文件如圖片等。
r+打開(kāi)一個(gè)文件用于讀寫。文件指針將會(huì)放在文件的開(kāi)頭。
rb+以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫。文件指針將會(huì)放在文件的開(kāi)頭。一般用于非文本文件如圖片等。
w打開(kāi)一個(gè)文件只用于寫入。如果該文件已存在則打開(kāi)文件,并從開(kāi)頭開(kāi)始編輯,即原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。
wb以二進(jìn)制格式打開(kāi)一個(gè)文件只用于寫入。如果該文件已存在則打開(kāi)文件,并從開(kāi)頭開(kāi)始編輯,即原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。一般用于非文本文件如圖片等。
w+打開(kāi)一個(gè)文件用于讀寫。如果該文件已存在則打開(kāi)文件,并從開(kāi)頭開(kāi)始編輯,即原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。
wb+以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫。如果該文件已存在則打開(kāi)文件,并從開(kāi)頭開(kāi)始編輯,即原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。一般用于非文本文件如圖片等。
a打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。也就是說(shuō),新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件進(jìn)行寫入。
ab以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。也就是說(shuō),新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件進(jìn)行寫入。
a+打開(kāi)一個(gè)文件用于讀寫。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。文件打開(kāi)時(shí)會(huì)是追加模式。如果該文件不存在,創(chuàng)建新文件用于讀寫。
ab+以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。如果該文件不存在,創(chuàng)建新文件用于讀寫。
with open('url.txt','w') as f: #在當(dāng)前路徑下,以寫的方式打開(kāi)一個(gè)名為'url.txt',如果不存在則創(chuàng)建f.write(text) #將text里的數(shù)據(jù)寫入到文本中

2.4.2 保存圖片

需要用二進(jìn)制, 'wb'

with open(file_path, 'wb') as f:f.write(soup.content)

2.4.3 保存表格table數(shù)據(jù)

  • 工信部表格數(shù)據(jù)保存方法,source:https://blog.csdn.net/zhang862520682/article/details/86701078
# 先請(qǐng)求頁(yè)面,xpath定位表格區(qū)域 res = requests.get('http://www.csres.com/notice/50655.html') res_elements = etree.HTML(res.text) table = res_elements.xpath('//table[@id="table1"]') table = etree.tostring(table[0], encoding='utf-8').decode()# 調(diào)用pandas的read_html方法解析表格數(shù)據(jù) df = pd.read_html(table, encoding='utf-8', header=0)[0] results = list(df.T.to_dict().values()) # 轉(zhuǎn)換成列表嵌套字典的格式轉(zhuǎn)存為csv文件 df.to_csv("std.csv", index=False)
  • 百度百科表格數(shù)據(jù)保存
temp

2.4.4?將數(shù)據(jù)重復(fù)寫入已存在的excel文件

# 保存信息框數(shù)據(jù)到excelif not os.path.exists('profile'):os.mkdir('profile')profile_file = project_path + '/profile/' + 'profile.csv'field_list = ['中文名', '外文名', '別名', '性別', '學(xué)位', '職稱', '國(guó)籍', '民族', '出生地', '籍貫', '出生日期', '逝世日期','星座', '血型', '身高','體重', '畢業(yè)院校', '職業(yè)', '經(jīng)紀(jì)公司', '代表作品', '主要成就', '生肖', '語(yǔ)種', '特長(zhǎng)', '粉絲名']if not os.path.exists(profile_file):workbook = xlwt.Workbook(encoding='utf-8')output_sheet = workbook.add_sheet('profile_sheet', cell_overwrite_ok=True)for i in range(len(field_list)):output_sheet.write(0, i, field_list[i])workbook.save(profile_file)rb = xlrd.open_workbook(profile_file)rows_num = rb.sheet_by_name('profile_sheet').nrows# print(rows_num)wb = copy(rb)output_sheet = wb.get_sheet(0)# print(profile)for i in range(len(field_list)):if profile_dict.get(field_list[i]):output_sheet.write(rows_num, i, profile_dict.get(field_list[i]))else:continueos.remove(profile_file)wb.save(profile_file)

3. 爬蟲(chóng)難點(diǎn)要點(diǎn)

3.1 設(shè)置headers

  • 偽造火狐瀏覽器的headers
# 請(qǐng)求頭部,偽造瀏覽器,防止爬蟲(chóng)被反headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
  • 自己設(shè)置headers ??
# 創(chuàng)建一個(gè)sessionsession = requests.Session()# 設(shè)置用于訪問(wèn)的請(qǐng)求頭headers = {'accept': 'application/json, text/javascript, */*; q=0.01','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9','content-type': 'application/x-www-form-urlencoded; charset=UTF-8','origin': 'https://mm.taobao.com','referer': 'https://mm.taobao.com/search_tstar_model.htm','user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36','x-requested-with': 'XMLHttpRequest',}

session是requests庫(kù)中的一個(gè)類,創(chuàng)建session對(duì)象進(jìn)行訪問(wèn)的好處是,session對(duì)象能夠自動(dòng)維護(hù)訪問(wèn)的cookies信息(通過(guò)js修改的cookies信息它是記錄不到的)

--> 為啥要記錄cookies信息因?yàn)橛行┱军c(diǎn)的服務(wù)器會(huì)驗(yàn)證你的cookies信息,當(dāng)cookies信息不正確時(shí),服務(wù)器會(huì)拒絕你的訪問(wèn)

--> 設(shè)置headers和data的目的:是為了將本次請(qǐng)求偽裝成瀏覽器的請(qǐng)求,并通過(guò)傳遞的數(shù)據(jù)控制服務(wù)器返回我們需要的信息。
————————————————
版權(quán)聲明:本文為CSDN博主「筆墨留年」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/aaronjny/article/details/80291997

3.2 字符編解碼知識(shí)

現(xiàn)在html網(wǎng)頁(yè)基本都采用utf-8編碼,在爬蟲(chóng)爬取網(wǎng)頁(yè)時(shí)不必過(guò)多關(guān)注網(wǎng)頁(yè)的編解碼。

以前,request返回的消息編碼為gb2312,我們需要先進(jìn)行解碼decode('utf-8'),才不會(huì)出現(xiàn)亂碼。比如:淘女郎case,因?yàn)橹黜?yè)源碼為gbk編碼,所以需要先用gbk對(duì)其解碼。

唯一一個(gè)例外時(shí)urllib發(fā)送url請(qǐng)求獲取網(wǎng)頁(yè)源碼時(shí),需要先解碼decode('utf-8'),再進(jìn)行網(wǎng)頁(yè)解析,不然會(huì)出現(xiàn)亂碼

延伸閱讀:https://www.crifan.com/summary_explain_what_is_html_charset_and_common_value_of_gb2312_gbk_utf_8_iso8859_1/

3.3?爬取動(dòng)態(tài)頁(yè)面?

source:?淘女郎case

problem: 爬取的內(nèi)容是從源碼取得的,但是在頁(yè)面中看到了內(nèi)容,在源碼里面卻沒(méi)有,why?

analysis: 這就是動(dòng)態(tài)頁(yè)面抓取。當(dāng)我們?cè)L問(wèn)這個(gè)網(wǎng)址的時(shí)候,瀏覽器返回給我們的只有一部分信息==> "數(shù)據(jù)加載中" 實(shí)際上,服務(wù)器先給我們返回了這個(gè)頁(yè)面,然后又通過(guò)ajax技術(shù),請(qǐng)求了另外一個(gè)借口。接口返回了淘女郎們的信息,隨后瀏覽器運(yùn)行javascript代碼,將這些信息填充到先前額頁(yè)面中。因此,我們才在頁(yè)面中看到了淘女郎們的信息。

(源碼頁(yè)面 -> 檢查 -> 網(wǎng)絡(luò) -> 內(nèi)容信息)

3.4?爬蟲(chóng)爬取的圖片損壞、無(wú)法打開(kāi)

--> attention:需要用二進(jìn)制binary格式保存圖片,即'wb'

problem:pycharm?imge not loaded try to open it enternally to fix format problem

analysis:原因是不能用bref圖片網(wǎng)址保存圖片,需要用src圖片網(wǎng)址保存圖片

by the way:我送你解析圖片標(biāo)簽過(guò)程中,過(guò)濾無(wú)效img圖片的正則表達(dá)式

# img_list = soup.select('div .album-wrap')img_list = soup.select('a>div>img')# print(img_list)for img in img_list:try:# src = img.find('img').get('src')src = img.get('src')if re.match(r'https:(.*)image(.*)auto$', src):img_urllist.append(src)except:continue

至于為啥用soup.select()而不是soup.find_all()? 我個(gè)人認(rèn)為,select()方法兼容方法更多,更關(guān)鍵的是,它支持提取子標(biāo)簽匹配規(guī)則,即:'a>div>img'。

by the way: 提取標(biāo)簽中子標(biāo)簽的屬性值

src = img.find('img').get('src')

3.5 異常處理

  • SSL: CERTIFICATE_VERIFY_FAILED。因?yàn)楫?dāng)使用urllib.urlopen打開(kāi)一個(gè) https 鏈接時(shí),會(huì)驗(yàn)證一次 SSL 證書(shū)。
import ssl ssl._create_default_https_context = ssl._create_unverified_context
  • 怎么去除抓取數(shù)據(jù)中的'\xa0\xa0\xa0\xa亂碼 -->?''.join(str.split())方法,但是這種方法會(huì)刪除原有文本中的空格
>>> s ='1室1廳1衛(wèi) \xa0\xa0\xa0\xa038㎡' >>> "" .join(s. split()) '1室1廳1衛(wèi)38㎡'
  • 如何刪除爬取的html網(wǎng)頁(yè)內(nèi)容中的NBSP-亂碼空格,string.replace(u'\xa0', u' ')
# 刪除爬取到html內(nèi)容中的nbsp:str.replace(u'\xa0', u' ') row_content = re.sub('\n', '', row_content.replace(u'\xa0', u' ')) br_text_list.append(row_content + '\n')

3.6 如何獲取兩個(gè)不同之間的所有文本

BeautifulSoup_object的previous_sibling、previous_siblings 和?next_sibling、next_siblings方法,可以獲取同級(jí)標(biāo)簽文本,即兄弟節(jié)點(diǎn)的文本。?

source:https://blog.csdn.net/u011378313/article/details/79086508;https://blog.csdn.net/weixin_38517397/article/details/108207928?

sibling_soup = BeautifulSoup(sibling_html, 'html.parser') br = sibling_soup.p while br.next_sibling != None:print brbr = br.next_sibling --------------------------------------------------------------- for tag in soup.select('div .col-md-4'):if tag.get_text() == 'Total':result = tag.next_sibling.get_text()

--> 判斷each br?in 返回的標(biāo)簽兄弟節(jié)點(diǎn)列表 是否是標(biāo)簽,因?yàn)橛行┬值芄?jié)點(diǎn)為空。

for br in i.next_siblings: # 獲取人物履歷標(biāo)簽后面所有的兄弟標(biāo)簽# print(br)if type(br) is bs4.element.Tag: # 判斷br是不是一個(gè)標(biāo)簽attrs = ''.join(br.attrs['class'])if attrs == 'para':br_text_list.append(br.get_text())elif attrs == re.compile('para-title level'):breakelse:continue

source:http://www.voidcn.com/article/p-eqwgopwx-bvx.html

from bs4 import BeautifulSoupsoup = BeautifulSoup("""<html><div class="lead">lead</div>data<div class="end"></div></html>"""", "lxml")node = soup.find('div', {'class': 'lead'}) s = [] while True:if node is None:breaknode = node.next_siblingif hasattr(node, "attrs") and ("end" in node.attrs['class'] ):break else:if node is not None:s.append(node) print s

參考

[1]?爬蟲(chóng)實(shí)戰(zhàn)(一) 用Python爬取百度百科,?https://www.cnblogs.com/wsmrzx/p/10531708.html

[2]?python爬蟲(chóng)入門教程(二):開(kāi)始一個(gè)簡(jiǎn)單的爬蟲(chóng),?https://blog.csdn.net/aaronjny/article/details/77945329

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的python爬虫基础(一)~爬虫概念和架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。