python网络爬虫:BeautifulSoup

BeautifulSoup

beautifulsoup:作用是从html/xml中提取数据,会载入整个HTML DOM, 比lxml解析器效率要低

pip3 install beautifulsoup4

以腾讯招聘数据提取为例

#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)

    #这种根据偏移量构建下一页的方式并不好
    #如果页面源码里面有下一页字样,可以提取该标签的href属性
    # #构建下一页的偏移量
    # next_offset = offset+10
    # #继续发起请求,解析数据
    # tencentJob(next_offset)

def loda_data(url):
    """
    发起请求,获取职位列表页页面源码
    :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):
    """
    解析分页的页面源码数据
    :param html:
    :return:
    """
    """
    features=None:指明bs解析器
    lxml:使用lxml下的html解析器
    html.parser:是python自带的一个解析器模块
    """
    html_bs = BeautifulSoup(html,features='lxml')
    #找到职位列表
    # html_bs.find():查找一个节点
    # html_bs.find_all():查找所有符合条件的节点
    """
    name=None, 指定你要查找的标签名,可以是一个字符串,正则表达式,或者列表
    attrs={}, 根据属性的值查找标签(dict){'属性名称':'属性的值'}
    text=None, 可以是一个字符串,正则表达式,查找符合条件的文本内容
    limit=None 限制返回的标签的个数
    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()
        # #职位人数
        # 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()
        # #发布时间
        # 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)
        #数据持久化
        # 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):
    #创建一个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__':
    #设置起始偏移量
    offset = 0
    full_url = 'https://hr.tencent.com/position.php?&start=' + str(offset)
    tencentJob(full_url)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容