參數(shù)使用
from bs4 import BeautifulSoup
"""
features=None:指明beautifullsoup的解析器
lxml:使用lxml下的html解析器,如果出現(xiàn)亂碼,嘗試下一個(gè)
html.parse:python自帶的html解析器
"""
html_bs = BeautifulSoup(html, features='lxml')
# html_bs.find() #查找一個(gè)
# html_bs.find_all() # 查找所有復(fù)合條件的節(jié)點(diǎn)
"""
name=None,指定你要查找的標(biāo)簽名,可以使字符串,正則,也可以是列表
attrs={},根據(jù)屬性的值查找標(biāo)簽(dict){'屬性名稱':'屬性的值'}
text=None,:查找符合條件的文本內(nèi)容,正則表達(dá)式,字符串
limit=None,:限制返回的標(biāo)簽的個(gè)數(shù)
find_all:方法取出所有符合要求的數(shù)據(jù)并返回在一個(gè)列表里
select:單個(gè)符合要求的列表
"""
tr_even = html_bs.find_all(name='tr', attrs={'class': 'even'})
tr_odd = html_bs.find_all(name='tr', attrs={'class': 'odd'})
tr.select('td.l.square a').get_text()
爬蟲
# beautifulsoup:作用是從html/xml中提取數(shù)據(jù),會(huì)載入整個(gè)HTML DOM,
# 比lxml解析器效率要低
# pip3 install beautifulsoup4
#以騰訊招聘數(shù)據(jù)提取為例
#https://hr.tencent.com/position.php (第一頁(yè)url地址)
#https://hr.tencent.com/position.php?&start=10(第二頁(yè))
#https://hr.tencent.com/position.php?&start=20(第三頁(yè))
import requests
#使用BeautifulSoup,需要這么導(dǎo)入模塊
from bs4 import BeautifulSoup
def tencentJob(full_url):
html = loda_data(full_url)
next_url = parse_page_data(html)
if 'javascript:;' != next_url:
next_url = 'https://hr.tencent.com/'+next_url
tencentJob(next_url)
#這種根據(jù)偏移量構(gòu)建下一頁(yè)的方式并不好
#如果頁(yè)面源碼里面有下一頁(yè)字樣,可以提取該標(biāo)簽的href屬性
# #構(gòu)建下一頁(yè)的偏移量
# next_offset = offset+10
# #繼續(xù)發(fā)起請(qǐng)求,解析數(shù)據(jù)
# tencentJob(next_offset)
def loda_data(url):
"""
發(fā)起請(qǐng)求,獲取職位列表頁(yè)頁(yè)面源碼
:param url:
:return:
"""
req_header = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
response = requests.get(url,headers=req_header)
if response.status_code == 200:
return response.text
def parse_page_data(html):
"""
解析分頁(yè)的頁(yè)面源碼數(shù)據(jù)
:param html:
:return:
"""
"""
features=None:指明bs解析器
lxml:使用lxml下的html解析器
html.parser:是python自帶的一個(gè)解析器模塊
"""
html_bs = BeautifulSoup(html,features='lxml')
#找到職位列表
# html_bs.find():查找一個(gè)節(jié)點(diǎn)
# html_bs.find_all():查找所有符合條件的節(jié)點(diǎn)
"""
name=None, 指定你要查找的標(biāo)簽名,可以是一個(gè)字符串,正則表達(dá)式,或者列表
attrs={}, 根據(jù)屬性的值查找標(biāo)簽(dict){'屬性名稱':'屬性的值'}
text=None, 可以是一個(gè)字符串,正則表達(dá)式,查找符合條件的文本內(nèi)容
limit=None 限制返回的標(biāo)簽的個(gè)數(shù)
find_all方法返回的吧標(biāo)簽都放在列表中
"""
tr_even = html_bs.find_all(name='tr',attrs={'class':'even'})
tr_odd = html_bs.find_all(name='tr',attrs={'class':'odd'})
print(tr_odd)
print(tr_even)
for tr in tr_even+tr_odd:
# print(tr)
jobinfo = {}
#職位的名稱
#.get_text()表示取標(biāo)簽的文本
jobinfo['title'] = tr.select('td.l.square > a')[0].get_text()
# #職位的類型
# jobinfo['type'] = tr.select('td')[1].get_text()
jobinfo['type'] = tr.select('td:nth-of-type(2)')[0].get_text()
# #職位人數(shù)
# jobinfo['peopleNum'] = tr.select('td:nth-child(3)')[0].get_text()
jobinfo['peopleNum'] = tr.select('td')[2].get_text()
# #地點(diǎn)
# jobinfo['adress'] = tr.select('td:nth-child(4)')[0].get_text()
jobinfo['adress'] = tr.select('td')[3].get_text()
# #發(fā)布時(shí)間
# jobinfo['publistTime'] = tr.select('td:nth-child(5)')[0].get_text()
jobinfo['publistTime'] = tr.select('td')[4].get_text()
# 職位詳情地址
#https://hr.tencent.com/position_detail.php?id=46553&keywords=&tid=0&lid=0
detail_url = 'https://hr.tencent.com/' + tr.select('td.l.square > a')[0].attrs['href']
#職位詳情的html頁(yè)面源碼
html = loda_data(detail_url)
#獲取職位的要求和描述
jobinfo['content'] = parse_detail_data(html)
#數(shù)據(jù)持久化
# print(jobinfo)
print(jobinfo, detail_url)
#提取下一頁(yè)的url鏈接
next_url = html_bs.select('a#next')[0].attrs['href']
return next_url
def parse_detail_data(html):
#創(chuàng)建一個(gè)BeautifulSoup對(duì)象
html_bs = BeautifulSoup(html,features='lxml')
#使用css語(yǔ)法取出li標(biāo)簽
content_li = html_bs.select('ul.squareli li')
content = []
#取出li標(biāo)簽的文本,放入列表中
for li in content_li:
li_text = li.get_text()
content.append(li_text)
return ','.join(content)
if __name__ == '__main__':
#設(shè)置起始偏移量
offset = 0
full_url = 'https://hr.tencent.com/position.php?&start=' + str(offset)
tencentJob(full_url)
爬蟲:BeautifulSoup使用方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Python 基礎(chǔ) 我之前寫的《Python 3 極簡(jiǎn)教程.pdf》,適合有點(diǎn)編程基礎(chǔ)的快速入門,通過(guò)該系列文章學(xué)...
- python爬數(shù)據(jù)小試牛刀--beautifulSoup使用 1.環(huán)境配置 編譯環(huán)境:python 2.7 編譯器...