參數(shù)使用
from bs4 import BeautifulSoup
"""
features=None:指明beautifullsoup的解析器
lxml:使用lxml下的html解析器,如果出現(xiàn)亂碼,嘗試下一個
html.parse:python自帶的html解析器
"""
html_bs = BeautifulSoup(html, features='lxml')
# html_bs.find() #查找一個
# html_bs.find_all() # 查找所有復合條件的節(jié)點
"""
name=None,指定你要查找的標簽名,可以使字符串,正則,也可以是列表
attrs={},根據(jù)屬性的值查找標簽(dict){'屬性名稱':'屬性的值'}
text=None,:查找符合條件的文本內(nèi)容,正則表達式,字符串
limit=None,:限制返回的標簽的個數(shù)
find_all:方法取出所有符合要求的數(shù)據(jù)并返回在一個列表里
select:單個符合要求的列表
"""
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ù),會載入整個HTML DOM,
# 比lxml解析器效率要低
# pip3 install beautifulsoup4
#以騰訊招聘數(shù)據(jù)提取為例
#https://hr.tencent.com/position.php (第一頁url地址)
#https://hr.tencent.com/position.php?&start=10(第二頁)
#https://hr.tencent.com/position.php?&start=20(第三頁)
import requests
#使用BeautifulSoup,需要這么導入模塊
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)建下一頁的方式并不好
#如果頁面源碼里面有下一頁字樣,可以提取該標簽的href屬性
# #構(gòu)建下一頁的偏移量
# next_offset = offset+10
# #繼續(xù)發(fā)起請求,解析數(shù)據(jù)
# tencentJob(next_offset)
def loda_data(url):
"""
發(fā)起請求,獲取職位列表頁頁面源碼
: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):
"""
解析分頁的頁面源碼數(shù)據(jù)
:param html:
:return:
"""
"""
features=None:指明bs解析器
lxml:使用lxml下的html解析器
html.parser:是python自帶的一個解析器模塊
"""
html_bs = BeautifulSoup(html,features='lxml')
#找到職位列表
# html_bs.find():查找一個節(jié)點
# html_bs.find_all():查找所有符合條件的節(jié)點
"""
name=None, 指定你要查找的標簽名,可以是一個字符串,正則表達式,或者列表
attrs={}, 根據(jù)屬性的值查找標簽(dict){'屬性名稱':'屬性的值'}
text=None, 可以是一個字符串,正則表達式,查找符合條件的文本內(nèi)容
limit=None 限制返回的標簽的個數(shù)
find_all方法返回的吧標簽都放在列表中
"""
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()表示取標簽的文本
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()
# #地點
# jobinfo['adress'] = tr.select('td:nth-child(4)')[0].get_text()
jobinfo['adress'] = tr.select('td')[3].get_text()
# #發(fā)布時間
# 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頁面源碼
html = loda_data(detail_url)
#獲取職位的要求和描述
jobinfo['content'] = parse_detail_data(html)
#數(shù)據(jù)持久化
# print(jobinfo)
print(jobinfo, detail_url)
#提取下一頁的url鏈接
next_url = html_bs.select('a#next')[0].attrs['href']
return next_url
def parse_detail_data(html):
#創(chuàng)建一個BeautifulSoup對象
html_bs = BeautifulSoup(html,features='lxml')
#使用css語法取出li標簽
content_li = html_bs.select('ul.squareli li')
content = []
#取出li標簽的文本,放入列表中
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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。