爬蟲:BeautifulSoup使用方法

參數(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)


?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容