網(wǎng)絡(luò)爬蟲:xpath

xpath:在html中查找信息姑尺,對xml文檔中的元素進行遍歷和屬性的提取

xml:是為了傳輸數(shù)據(jù),結(jié)構(gòu)域和HTML非常相像茎毁,是一種標記語言

xpath常見的語法:

nodename:選取此節(jié)點中的所有子節(jié)點
/:從根節(jié)點開始查找
//: 匹配節(jié)點,不考慮節(jié)點位置
. :選取當前節(jié)點
..:選取當前節(jié)點的父節(jié)點
@:取標簽的屬性  a/@href 取a標簽的href屬性
a/text():取標簽的文本
a[@class='123]:根據(jù)某個(class)屬性尋找標簽  a[@id='123]
a[@id='123'][last()]:取最后一個id為123的a標簽
a[@id='123'][position()<2]:取id為123的前兩個標簽
li[@id="123"][position()=2]:取第二個id為1123的li標簽
"""
import requests,re
from lxml.html import etree

# 案例()
# http://www.budejie.com/audio/
# http://www.budejie.com/audio/2
def load_page_data(url):
    """
    下載器根據(jù)頁面源碼獲取url分頁地址
    :param url:
    :return:
    """
    # proxies = {
    #     'http': '59.37.33.62:50686',
    #     'https': '61.128.208.94:3128',
    #     'https': 'http://username:password@ip:port'  # 私密代理
    # }

    req_headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }
    response = requests.get(url,headers=req_headers)
    response.encoding = 'utf-8'
    if response.status_code ==200:
        print('請求成功')
        status = parse_page_data(response.text)
        # with open('page.html','w',encoding='utf-8') as file:
        #     file.write(response.text)
        if status:
            # 請求下一頁
            pattern = re.compile('\d+')
            #    當前頁碼
            cur_page = re.search(pattern,response.url).group()
            # 下一頁
            next_page = int(cur_page)+1
            # 下一頁url
            next_page_url = re.sub(pattern,str(next_page),response.url)
            load_page_data(next_page_url)


def parse_page_data(html):
    """
    使用xpath從頁面源碼提取數(shù)據(jù)

    :param html:
    :return:
    """
    # 使用etree
    html_element = etree.HTML(html)
    auto_list = html_element.xpath('//div[@class="j-r-c"]/div[@class="j-r-list"]/ul/li')
    # print(auto_list)
    # print(type(auto_list))
    for auto in auto_list:
        auto_data = {}
        # 取出標題
        auto_data['name'] = auto.xpath('.//a[@class="u-user-name"]/text()')[0]
        # 取出內(nèi)容
        auto_data['content'] = auto.xpath('.//div[@class="j-r-list-c-desc"]/text()')[0]
        # 發(fā)布時間
        auto_data['pubLishTime'] = auto.xpath('.//span[@class="u-time  f-ib f-fr"]/text()')[0]
        # 點贊數(shù)
        auto_data['zanNum'] = auto.xpath('.//li[@class="j-r-list-tool-l-up"]/span/text()')[0]
        # 不喜歡
        auto_data['lowNum'] = auto.xpath('.//li[@class="j-r-list-tool-l-down "]/span/text()')
        #3 音頻
        auto_data['url'] = auto.xpath('.//div[@class=" j-audio"]/@data-mp3')[0]
        print(auto_data)
        download_audio_by_url(auto_data['url'], auto_data)
    if len(auto_list)>0:
        return True
    else:
        return False

def download_audio_by_url(url,auto):
    proxies = {
        'http': '59.37.33.62:50686',
        'https': '61.128.208.94:3128',
        'https': 'http://username:password@ip:port'  # 私密代理
    }
    req_header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }
    response = requests.get(url,headers=req_header)
    if response.status_code == 200:
        # print(response.url, '下載成功')
        filename = response.url[-17:]
        with open('baisibudejie/' + filename, 'wb') as file:
            file.write(response.content)
            auto['localpath'] = 'baisibudejie/' + filename
            print('完成')
        # 將數(shù)據(jù)存儲到數(shù)據(jù)庫
        save_data_to_db(auto)

def save_data_to_db(audio):
    print(audio)

if __name__ == "__main__":
    start_url ='http://www.budejie.com/audio/1'
    load_page_data(start_url)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忱辅,一起剝皮案震驚了整個濱河市七蜘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墙懂,老刑警劉巖橡卤,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異损搬,居然都是意外死亡碧库,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門巧勤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嵌灰,“玉大人,你說我怎么就攤上這事颅悉」敛t!?“怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵剩瓶,是天一觀的道長驹溃。 經(jīng)常有香客問我城丧,道長,這世上最難降的妖魔是什么吠架? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任芙贫,我火速辦了婚禮,結(jié)果婚禮上傍药,老公的妹妹穿的比我還像新娘磺平。我一直安慰自己,他們只是感情好拐辽,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布拣挪。 她就那樣靜靜地躺著,像睡著了一般俱诸。 火紅的嫁衣襯著肌膚如雪菠劝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天睁搭,我揣著相機與錄音赶诊,去河邊找鬼。 笑死园骆,一個胖子當著我的面吹牛舔痪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锌唾,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锄码,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晌涕?” 一聲冷哼從身側(cè)響起滋捶,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎余黎,沒想到半個月后重窟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡驯耻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年亲族,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可缚。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡霎迫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帘靡,到底是詐尸還是另有隱情知给,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站涩赢,受9級特大地震影響戈次,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筒扒,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一怯邪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧花墩,春花似錦悬秉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祠肥,卻和暖如春武氓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仇箱。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工县恕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剂桥。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓弱睦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渊额。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容