爬取知乎專欄

一.收集相關(guān)信息

1.找到需要爬取的專欄URL

https://zhuanlan.zhihu.com/(專欄名稱)
比如:
https://zhuanlan.zhihu.com/lingkou-solution
1-1-1

2.找到請(qǐng)求URL, cookie, user-agent等信息

找到articles的URL, 縮略地址如下

https://zhuanlan.zhihu.com/api/columns/lingkou-solution/articles

完整地址如下

https://zhuanlan.zhihu.com/api/columns/lingkou-solution/articles?include=data%5B*%5D.admin_closed_comment%2Ccomment_count%2Csuggest_edit%2Cis_title_image_full_screen%2Ccan_comment%2Cupvoted_followees%2Ccan_open_tipjar%2Ccan_tip%2Cvoteup_count%2Cvoting%2Ctopics%2Creview_info%2Cauthor.is_following%2Cis_labeled%2Clabel_info
1-2-1

1-2-2

1-2-3

1-2-4

3.分析接口

根據(jù)完整的地址, 請(qǐng)求, 分析返回的數(shù)據(jù)
如圖1-3-1, 根據(jù)key可以得到一些信息

"paging": {
        "is_end": false, // 是否是最后一頁(yè)
        "totals": 39, // 該專欄文章總數(shù)
        // 上一頁(yè)地址
        "previous": "https://zhuanlan.zhihu.com/columns/lingkou-solution/articles?include=data%5B%2A%5D.admin_closed_comment%2Ccomment_count%2Csuggest_edit%2Cis_title_image_full_screen%2Ccan_comment%2Cupvoted_followees%2Ccan_open_tipjar%2Ccan_tip%2Cvoteup_count%2Cvoting%2Ctopics%2Creview_info%2Cauthor.is_following%2Cis_labeled%2Clabel_info&limit=10&offset=0",
        "is_start": true, // 是否是第一頁(yè)
        // 下一頁(yè)地址
        "next": "https://zhuanlan.zhihu.com/columns/lingkou-solution/articles?include=data%5B%2A%5D.admin_closed_comment%2Ccomment_count%2Csuggest_edit%2Cis_title_image_full_screen%2Ccan_comment%2Cupvoted_followees%2Ccan_open_tipjar%2Ccan_tip%2Cvoteup_count%2Cvoting%2Ctopics%2Creview_info%2Cauthor.is_following%2Cis_labeled%2Clabel_info&limit=10&offset=10"
    },
1-3-1

如圖1-3-2, data是文章列表, 一頁(yè)有10個(gè),我們要獲取里面的id和title


1-3-2

二.開始爬取

1.代碼準(zhǔn)備

需要安裝wkhtmltopdf + pdfkit
wkhtmltopdf要從官網(wǎng)下載, 如果是Windows使用, 還需要配置路徑

https://wkhtmltopdf.org/downloads.html
config = pdfkit.configuration(wkhtmltopdf='wkhtmltopdf.exe 存在路徑')
pdfkit.from_url("目標(biāo)網(wǎng)址", "輸出檔案", configuration=config)

pdfkit 是對(duì)此工具封裝的 Python 庫(kù),可從 pip 安裝:

pip install pdfkit
import requests
from requests import RequestException
from bs4 import BeautifulSoup
import pdfkit
import os
import lxml
import re
import time

CURRENT_FILE_PATH = os.path.dirname(os.path.abspath('__file__'))

2.準(zhǔn)備URL, header,user-angent等

url = 'https://zhuanlan.zhihu.com/api/columns/lingkou-solution/articles?include=data%5B*%5D.admin_closed_comment%2Ccomment_count%2Csuggest_edit%2Cis_title_image_full_screen%2Ccan_comment%2Cupvoted_followees%2Ccan_open_tipjar%2Ccan_tip%2Cvoteup_count%2Cvoting%2Ctopics%2Creview_info%2Cauthor.is_following%2Cis_labeled%2Clabel_info'
cookie = '_xsrf=3bb33dbe-5749-4743-b897-e7aa515bf65a; _zap=53a6c2b5-1d4c-4a0e-81e3-8b5d56019c35; d_c0="AEChZA3T_g-PTn1jyfsKuj_apKrFA5GHFVs=|1567579015"; tgw_l7_route=66cb16bc7f45da64562a077714739c11'
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
headers = {'cookie': cookie, 'user-agent': user_agent}

3.開始爬取, 獲取所以的文章

def get_zhihu_data() -> list:
    array_list = []
    global url
    
    while True:
        try:
            resp = requests.get(url, headers=headers)
        except RequestException as error:
            print('get data error', error)
        else:
            if resp.status_code != 200:
                print('get data status_code error')
                break
            j = resp.json()
            data = j['data']
            for article in data:
                print(article.get('id'), article.get('title')) 
                info = {
                    'id': article.get('id'), 
                    'title': article.get('title'),
                }
                array_list.append(info)
            
            paging = j.get('paging')
            if paging['is_end']:
                break
            url = paging['next']
            url = url.replace('zhuanlan.zhihu.com', 'zhuanlan.zhihu.com/api')
        time.sleep(2)
        
        # 我只抓取第一頁(yè)數(shù)據(jù), 如要抓取所有, 注釋掉break
        break
    return array_list

4. 訪問(wèn)每個(gè)文章主頁(yè), 保存到本地html

def save_data_html(array_list):
    index = 1
    for item in array_list:
        url = 'https://zhuanlan.zhihu.com/p/%s' % item['id']
        name = f'{index:03}' + '-' + item['title']
        while '/' in name:
            name = name.replace('/', '')
        html = requests.get(url, headers=headers).text

        soup = BeautifulSoup(html, 'lxml')
        content = soup.prettify()
        # content = soup.find(class_='Post-Main Post-NormalMain').prettify()
        content = content.replace('data-actual', '')
        content = content.replace('h1>', 'h2>')
        content = re.sub(r'<noscript>.*?</noscript>', '', content)
        content = re.sub(r'src="data:image.*?"', '', content)
        # content = '<!DOCTYPE html><html><head><meta charset="utf-8"></head><body><h1>%s</h1>%s</body></html>' % (name, content)

        with open('%s.html' % name, 'w') as f:
            f.write(content)
        index += 1

三.把html轉(zhuǎn)成PDF

def cover_html_to_pdf():
    file_list =  os.listdir(CURRENT_FILE_PATH)
    all_html_list = []
    for path in file_list:
        file_extension = os.path.splitext(path)[1]
        if file_extension == '.html':
            all_html_list.append(path)
    all_html_list.sort()
    print(all_html_list)

    pdfkit.from_file(all_html_list, 'zhihu.pdf')

轉(zhuǎn)成后的效果如下圖


3-1-1

完整代碼地址

https://github.com/yangyu2010/Crossin-Day21/blob/master/Other/cross_zhihu.py
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娶聘,一起剝皮案震驚了整個(gè)濱河市鹦赎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猾瘸,老刑警劉巖界赔,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丢习,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淮悼,警方通過(guò)查閱死者的電腦和手機(jī)咐低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袜腥,“玉大人见擦,你說(shuō)我怎么就攤上這事「睿” “怎么了鲤屡?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)特恬。 經(jīng)常有香客問(wèn)我执俩,道長(zhǎng),這世上最難降的妖魔是什么癌刽? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任役首,我火速辦了婚禮,結(jié)果婚禮上显拜,老公的妹妹穿的比我還像新娘衡奥。我一直安慰自己,他們只是感情好远荠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布矮固。 她就那樣靜靜地躺著,像睡著了一般譬淳。 火紅的嫁衣襯著肌膚如雪档址。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天邻梆,我揣著相機(jī)與錄音守伸,去河邊找鬼。 笑死浦妄,一個(gè)胖子當(dāng)著我的面吹牛尼摹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剂娄,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蠢涝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了阅懦?” 一聲冷哼從身側(cè)響起和二,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎故黑,沒(méi)想到半個(gè)月后儿咱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庭砍,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年混埠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠缸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钳宪,死狀恐怖揭北,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吏颖,我是刑警寧澤搔体,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站半醉,受9級(jí)特大地震影響疚俱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缩多,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一呆奕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衬吆,春花似錦梁钾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冒嫡,卻和暖如春拇勃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孝凌。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工潜秋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胎许。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像罗售,于是被迫代替她去往敵國(guó)和親辜窑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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