爬蟲基礎(chǔ)_03——xpath

今天是利用xpath爬取網(wǎng)址: 簡書首頁
包括:標(biāo)題饺蔑,作者,發(fā)表時(shí)間嗜诀,內(nèi)容猾警,閱讀量,評(píng)論數(shù)隆敢,點(diǎn)贊數(shù)发皿,打賞數(shù),所投專題
主要思想:利用xpath獲取網(wǎng)頁中的數(shù)據(jù)拂蝎,然后存到本地的csv
下面了解一下xpath的用法
首先必須要導(dǎo)入 lxml 庫
Python爬蟲利器三之Xpath語法與lxml庫的用法

1穴墅、首先是爬的第一頁的數(shù)據(jù)
運(yùn)行代碼:

#coding: utf-8
import requests
from lxml import etree
import csv


user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
header = {'User-Agent': user_agent}
html = requests.get('http://www.reibang.com/', headers = header).content

selector = etree.HTML(html)
infos = selector.xpath('//div[@id="list-container"]/ul/li/div')
a = []
# 第一頁數(shù)據(jù)的匹配
for info in infos:
    titles = info.xpath('a/text()')[0]
    authors = info.xpath('div[1]/div/a/text()')[0]
    times = info.xpath('div[1]/div/span/@data-shared-at')[0]
    contents = info.xpath('p/text()')[0].strip()
    try:
        read_counts = info.xpath('div[2]/a[2]/text()')[1].strip()
    except:
        read_counts = '0'
    try:
        comment_counts = info.xpath('div[2]/a[3]/text()')[1].strip()
    except:
        comment_counts = '0'
    try:
        vote_counts = info.xpath('//div/div[2]/span[1]/text()')[0].strip()
    except:
        vote_counts = '0'
    try:
        reward_counts = info.xpath('div[2]/span[2]/text()')[0]
    except:
        reward_counts = '0'
    try:
        subjects = info.xpath('div[2]/a[1]/text()')[0]
    except:
        subjects = '暫未收錄專題'
    #print(titles, authors, times, contents, read_counts, comment_counts, vote_counts, reward_counts, subjects)

    data = {
        '文章標(biāo)題': titles,
        '作者': authors,
        '發(fā)表時(shí)間': times,
        '內(nèi)容': contents,
        '閱讀量': read_counts,
        '評(píng)論數(shù)': comment_counts,
        '點(diǎn)贊數(shù)': vote_counts,
        '打賞數(shù)': reward_counts,
        '主題': subjects,

    }
    a.append(data)
#print(a)

#把爬到的數(shù)據(jù)存儲(chǔ)到csv
csv_name = ['文章標(biāo)題', '作者', '發(fā)表時(shí)間', '內(nèi)容', '閱讀量', '評(píng)論數(shù)', '點(diǎn)贊數(shù)', '打賞數(shù)', '主題']
with open('jianshu_xpath.csv', 'w', newline = '',encoding='utf-8')as csvfile:
    write = csv.DictWriter(csvfile, fieldnames = csv_name)
    write.writeheader()
    write.writerows(a)
    csvfile.close()

運(yùn)行結(jié)果:

第一頁的文章信息.png

第一頁比較容易,主要是每個(gè)數(shù)據(jù)爬取路徑的選取,還有循環(huán)點(diǎn)的選确饩取拇涤;
2.爬取簡書首頁前15頁的數(shù)據(jù)
a、首先要分析一下每頁的加載方式誉结,通過點(diǎn)擊更多鹅士,可以發(fā)現(xiàn)url并沒有變化,所以是異步加載惩坑,下面要抓包分析一下后面每頁請(qǐng)求的url有什么共同點(diǎn)掉盅。

Paste_Image.png
Paste_Image.png

上面每頁的id都可以在上一頁找到,而且是會(huì)累加的以舒,

Paste_Image.png

Paste_Image.png

具體的分析可以參看liang的文章http://www.reibang.com/p/9afef50a8cc7趾痘,寫的很詳細(xì),就不多說了蔓钟;
運(yùn)行代碼:

#coding: utf-8
import requests
from lxml import etree
import csv


user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
header = {'User-Agent': user_agent,
          'cookie': 'remember_user_token=W1szNjE3MDgyXSwiJDJhJDEwJDMuQTVNeHVYTkUubFQvc1ZPM0V5UGUiLCIxNDk3MTcyNDA2Ljk2ODQ2NjMiXQ%3D%3D--56522c2190961ce284b1fe108b267ae0cd5bf32a; _session_id=YVRyNm5tREZkK1JwUGFZVDNLdjJoL25zVS8yMjBnOGlwSnpITEE0U0drZHhxSU5XQVpYM2RpSmY5WU44WGJWeHVZV3d1Z1lINHR0aXhUQzR6Z1pMUW52RGI5UHpPRVFJRk5HeUcybEhwc21raVBqbk9uZmhjN0xQWmc2ZFMreXhGOHlhbmJiSDBHQUVsUTNmN2p0M2Y2TjgrWnBjVis4ODE4UXRhWmJ6K2VETHJlakhHbEl0djhDNDRKYVZEWndENjhrSGIvZ1crNC9NNnh4UmlpOVFPNWxGWm1PUmxhQk1sdnk2OXozQVZwU1hXVm9lMTU3WkUyUkhialZKZ2MvVkFOYk1tOUw3STkrMGNFWXVIaklDNlNpTmkrVi9iNDIrRzBDU0ZNNnc3b3I2bkhvLzFCSCsvTWdsUDExdEZBa0RsU3RqTURWcjdNU1VOTGVBeTk2MERMUXN1UlZqUytuYXdWdnI4cTkxTjFPbG5Ia3IzK3NXcVNpMENwWVZPSUV3TWU4TENaRWUva24ybXMzSE9MTVZRSEdrVDJhMzhzM05RUnBoMk8xU1FHYz0tLTFxUnlXWTZLQXM4dW9EQmVxMHZwRWc9PQ%3D%3D--6fb5c178053ee287201628ee5d7b2b61c170e994'}

a = []
params = []
#獲取每一頁的url
for p in range(1,16):
    url_data = '&'.join(params)
    url = 'http://www.reibang.com/?' + url_data + '&page={}'.format(p)
    #獲取每頁的數(shù)據(jù)
    html = requests.get(url, headers = header).text
    selector = etree.HTML(html)
    li_pages = selector.xpath('//div[@id="list-container"]/ul/li')
    for li_page in li_pages:
        li_page = 'seen_snote_ids[]=' + li_page.xpath('@data-note-id')[0]
        params.append(li_page)
    #print(len(params))
    infos = selector.xpath('//div[@id="list-container"]/ul/li/div')
    for info in infos:
        titles = info.xpath('a/text()')[0]
        authors = info.xpath('div[1]/div/a/text()')[0]
        times = info.xpath('div[1]/div/span/@data-shared-at')[0]
        contents = info.xpath('p/text()')[0].strip()
        try:
            read_counts = info.xpath('div[2]/a[2]/text()')[1].strip()
        except:
            read_counts = '0'
        try:
            comment_counts = info.xpath('div[2]/a[3]/text()')[1].strip()
        except:
            comment_counts = '0'
        try:
            vote_counts = info.xpath('//div/div[2]/span[1]/text()')[0].strip()
        except:
            vote_counts = '0'
        try:
                reward_counts = info.xpath('div[2]/span[2]/text()')[0]
        except:
                reward_counts = '0'
        try:
            subjects = info.xpath('div[2]/a[@class="collection-tag"]/text()')[0]
        except:
            subjects = '暫未收錄專題'

        #print(titles, authors, times, contents, read_counts, comment_counts, vote_counts, reward_counts, subjects)
        data = {
            '文章標(biāo)題': titles,
            '作者': authors,
            '發(fā)表時(shí)間': times,
            '內(nèi)容': contents,
            '閱讀量': read_counts,
            '評(píng)論數(shù)': comment_counts,
            '點(diǎn)贊數(shù)': vote_counts,
            '打賞數(shù)': reward_counts,
            '主題': subjects,
            }
        a.append(data)

        #存儲(chǔ)數(shù)據(jù)
        csv_name = ['文章標(biāo)題', '作者', '發(fā)表時(shí)間', '內(nèi)容', '閱讀量', '評(píng)論數(shù)', '點(diǎn)贊數(shù)', '打賞數(shù)', '主題']
        with open('jianshu_xpath2.csv', 'w', newline='', encoding='utf-8')as csvfile:
            write = csv.DictWriter(csvfile, fieldnames=csv_name)
            write.writeheader()
            write.writerows(a)


運(yùn)行結(jié)果:

簡書首頁所有的文章信息.png

注意這里取cookie的時(shí)候一定要登錄后再取cookie永票,否則只能爬到重復(fù)第一頁的數(shù)據(jù);
最后再把整個(gè)代碼整理封裝一下滥沫,稍微好看一點(diǎn):

#coding: utf-8
import requests
from lxml import etree
import csv

class Jianshu():

    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    header = {'User-Agent': user_agent,
              'cookie': 'remember_user_token=W1szNjE3MDgyXSwiJDJhJDEwJDMuQTVNeHVYTkUubFQvc1ZPM0V5UGUiLCIxNDk3MTcyNDA2Ljk2ODQ2NjMiXQ%3D%3D--56522c2190961ce284b1fe108b267ae0cd5bf32a; _session_id=YVRyNm5tREZkK1JwUGFZVDNLdjJoL25zVS8yMjBnOGlwSnpITEE0U0drZHhxSU5XQVpYM2RpSmY5WU44WGJWeHVZV3d1Z1lINHR0aXhUQzR6Z1pMUW52RGI5UHpPRVFJRk5HeUcybEhwc21raVBqbk9uZmhjN0xQWmc2ZFMreXhGOHlhbmJiSDBHQUVsUTNmN2p0M2Y2TjgrWnBjVis4ODE4UXRhWmJ6K2VETHJlakhHbEl0djhDNDRKYVZEWndENjhrSGIvZ1crNC9NNnh4UmlpOVFPNWxGWm1PUmxhQk1sdnk2OXozQVZwU1hXVm9lMTU3WkUyUkhialZKZ2MvVkFOYk1tOUw3STkrMGNFWXVIaklDNlNpTmkrVi9iNDIrRzBDU0ZNNnc3b3I2bkhvLzFCSCsvTWdsUDExdEZBa0RsU3RqTURWcjdNU1VOTGVBeTk2MERMUXN1UlZqUytuYXdWdnI4cTkxTjFPbG5Ia3IzK3NXcVNpMENwWVZPSUV3TWU4TENaRWUva24ybXMzSE9MTVZRSEdrVDJhMzhzM05RUnBoMk8xU1FHYz0tLTFxUnlXWTZLQXM4dW9EQmVxMHZwRWc9PQ%3D%3D--6fb5c178053ee287201628ee5d7b2b61c170e994'}

    a = []
    params = []
    def __init__(self):
        pass
    #獲取每一頁的url
    def total_page(self):
        for p in range(1,16):
            url_data = '&'.join(self.params)
            url = 'http://www.reibang.com/?' + url_data + '&page={}'.format(p)
            self.get_data(url)
    #獲取每頁的數(shù)據(jù)
    def get_data(self, url):
        html = requests.get(url, headers = self.header).text
        selector = etree.HTML(html)
        li_pages = selector.xpath('//*[@id="list-container"]/ul/li')
            #print(li_pages)
        for info in li_pages:
            info = 'seen_snote_ids%5B%5D=' + info.xpath('@data-note-id')[0]
            self.params.append(info)
        infos = selector.xpath('//div[@id="list-container"]/ul/li/div')
        for info in infos:
            titles = info.xpath('a/text()')[0]
            authors = info.xpath('div[1]/div/a/text()')[0]
            times = info.xpath('div[1]/div/span/@data-shared-at')[0]
            contents = info.xpath('p/text()')[0].strip()
            try:
                read_counts = info.xpath('div[2]/a[2]/text()')[1].strip()
            except:
                read_counts = '0'
            try:
                comment_counts = info.xpath('div[2]/a[3]/text()')[1].strip()
            except:
                comment_counts = '0'
            try:
                vote_counts = info.xpath('//div/div[2]/span[1]/text()')[0].strip()
            except:
                vote_counts = '0'
            try:
                reward_counts = info.xpath('div[2]/span[2]/text()')[0]
            except:
                reward_counts = '0'
            try:
                subjects = info.xpath('div[2]/a[@class="collection-tag"]/text()')[0]
            except:
                subjects = '暫未收錄專題'

            #print(titles, authors, times, contents, read_counts, comment_counts, vote_counts, reward_counts, subjects)
            data = {
                '文章標(biāo)題': titles,
                '作者': authors,
                '發(fā)表時(shí)間': times,
                '內(nèi)容': contents,
                '閱讀量': read_counts,
                '評(píng)論數(shù)': comment_counts,
                '點(diǎn)贊數(shù)': vote_counts,
                '打賞數(shù)': reward_counts,
                '主題': subjects,
                }
            self.a.append(data)
            #print(self.a)
            #存儲(chǔ)數(shù)據(jù)
            csv_name = ['文章標(biāo)題', '作者', '發(fā)表時(shí)間', '內(nèi)容', '閱讀量', '評(píng)論數(shù)', '點(diǎn)贊數(shù)', '打賞數(shù)', '主題']
            with open('jianshu_xpath2.csv', 'w', newline='', encoding='utf-8')as csvfile:
                write = csv.DictWriter(csvfile, fieldnames=csv_name)
                write.writeheader()
                write.writerows(self.a)

if __name__ == '__main__':
    jian = Jianshu()
    jian.total_page()

小結(jié):
1侣集、這里用xpath爬取網(wǎng)頁的內(nèi)容,是不是很方便兰绣?
雖然用正則世分、BeautifulSoup和Xpath都可以獲取網(wǎng)頁的內(nèi)容,但是要學(xué)會(huì)靈活應(yīng)用缀辩,有時(shí)遇到某一種方法獲取不到就要用另外的方法(比如正則臭埋,只要你的正則表達(dá)式?jīng)]寫錯(cuò),基本都是可以獲取網(wǎng)頁數(shù)據(jù))
2臀玄、這里爬取多頁是通過自己手動(dòng)分析網(wǎng)頁加載方式去構(gòu)造每頁的url瓢阴,然后爬取全部的數(shù)據(jù);對(duì)于這種異步加載的網(wǎng)頁镐牺,后面還會(huì)介紹其他的方法炫掐;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市睬涧,隨后出現(xiàn)的幾起案子募胃,更是在濱河造成了極大的恐慌,老刑警劉巖畦浓,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹束,死亡現(xiàn)場離奇詭異,居然都是意外死亡讶请,警方通過查閱死者的電腦和手機(jī)祷嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門屎媳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人论巍,你說我怎么就攤上這事烛谊。” “怎么了嘉汰?”我有些...
    開封第一講書人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵丹禀,是天一觀的道長。 經(jīng)常有香客問我鞋怀,道長双泪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任密似,我火速辦了婚禮焙矛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘残腌。我一直安慰自己村斟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開白布废累。 她就那樣靜靜地躺著邓梅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邑滨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評(píng)論 1 291
  • 那天钱反,我揣著相機(jī)與錄音掖看,去河邊找鬼。 笑死面哥,一個(gè)胖子當(dāng)著我的面吹牛哎壳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尚卫,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼归榕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吱涉?” 一聲冷哼從身側(cè)響起刹泄,我...
    開封第一講書人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怎爵,沒想到半個(gè)月后特石,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳖链,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年姆蘸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逞敷,死狀恐怖狂秦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情推捐,我是刑警寧澤裂问,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站玖姑,受9級(jí)特大地震影響愕秫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焰络,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一戴甩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闪彼,春花似錦甜孤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至描馅,卻和暖如春把夸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铭污。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來泰國打工恋日, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘹狞。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓岂膳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親磅网。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谈截,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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

  • 20170531 這幾天重新拾起了爬蟲,算起來有將近5個(gè)月不碰python爬蟲了涧偷。 對(duì)照著網(wǎng)上的程序和自己以前寫的...
    八神蒼月閱讀 14,151評(píng)論 3 44
  • 1 前言 作為一名合格的數(shù)據(jù)分析師簸喂,其完整的技術(shù)知識(shí)體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲(chǔ)嫂丙、數(shù)據(jù)提取娘赴、數(shù)據(jù)分析、數(shù)據(jù)挖掘跟啤、...
    whenif閱讀 18,064評(píng)論 45 523
  • 和apply類似的還有applymap和map, apply() 和applymap()是DataFrame數(shù)據(jù)類...
    馬爾克ov閱讀 1,157評(píng)論 0 0
  • 太陽出來嘍喂诽表,渾身暖洋洋唉锌。樹更綠,天更藍(lán)竿奏,蒼蠅更狂袄简,寒冷中的人呀,更幸福泛啸。 作畫與寫作好像绿语,或許這兩...
    散陽閱讀 333評(píng)論 0 1
  • 很多同學(xué)都覺得學(xué)英語很痛苦,要記單詞候址,背句型吕粹,好不容易筆頭上過的去了卻發(fā)現(xiàn)張不了口。說出來的英文很奇怪岗仑,今天...
    Estelle_Q閱讀 681評(píng)論 0 0