<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          拒絕低效!Python教你爬蟲公眾號文章和鏈接

          共 3640字,需瀏覽 8分鐘

           ·

          2020-02-11 23:25

          點擊上方Python知識圈,選擇設(shè)為星標(biāo)

          回復(fù)1024獲取Python資料


          25b2dd61248f88fca59ae55b477c4d7e.webp



          閱讀文本大概需要 5?分鐘


          前言

          上一篇文章整理了的公眾號所有文章的導(dǎo)航鏈接,其實如果手動整理起來的話,是一件很費力的事情,因為公眾號里添加文章的時候只能一篇篇的選擇,是個單選框。

          fbfaba9b76c98a95cb3177b142f3a981.webp

          面對幾百篇的文章,這樣一個個選擇的話,是一件苦差事。

          pk哥作為一個 Pythoner,當(dāng)然不能這么低效,我們用爬蟲把文章的標(biāo)題和鏈接等信息提取出來。

          抓包

          我們需要通過抓包提取公眾號文章的請求的 URL,參考之前寫過的一篇抓包的文章?Python爬蟲APP前的準(zhǔn)備,pk哥這次直接抓取 PC 端微信的公眾號文章列表信息,更簡單。

          我以抓包工具 Charles 為例,勾選容許抓取電腦的請求,一般是默認(rèn)就勾選的。

          951a34f8c1e67762a62d4feb2c8c0ccb.webp

          為了過濾掉其他無關(guān)請求,我們在左下方設(shè)置下我們要抓取的域名。

          7724f92ff10d59fe7c521270bfa17ada.webp

          打開 PC 端微信,打開 「Python知識圈」公眾號文章列表后,Charles 就會抓取到大量的請求,找到我們需要的請求,返回的 JSON 信息里包含了文章的標(biāo)題、摘要、鏈接等信息,都在 comm_msg_info 下面。

          68df77425828c76f266a51e1189984a8.webp4c33f1e589adbf4d82177ce4f52771c5.webp

          這些都是請求鏈接后的返回,請求鏈接 url 我們可以在 Overview 中查看。

          38d32e63358e13949db3e3d91102a990.webp

          通過抓包獲取了這么多信息后,我們可以寫爬蟲爬取所有文章的信息并保存了。

          初始化函數(shù)

          公眾號歷史文章列表向上滑動,加載更多文章后發(fā)現(xiàn)鏈接中變化的只有 offset 這個參數(shù),我們創(chuàng)建一個初始化函數(shù),加入代理 IP,請求頭和信息,請求頭包含了 User-Agent、Cookie、Referer。

          b824f332c97a8c3f7764ccae9281f329.webp

          這些信息都在抓包工具可以看到。

          a8d76d90b2404975bca972cba36361c1.webp

          請求數(shù)據(jù)

          通過抓包分析出來了請求鏈接,我們就可以用 requests 庫來請求了,用返回碼是否為 200 做一個判斷,200 的話說明返回信息正常,我們再構(gòu)建一個函數(shù) parse_data() 來解析提取我們需要的返回信息。

          def?request_data(self):
          ????try:
          ????????response?=?requests.get(self.base_url.format(self.offset),?headers=self.headers,?proxies=self.proxy)
          ????????print(self.base_url.format(self.offset))
          ????????if?200?==?response.status_code:
          ???????????self.parse_data(response.text)
          ????except?Exception?as?e:
          ????????print(e)
          ????????time.sleep(2)
          ????????pass

          提取數(shù)據(jù)

          通過分析返回的 Json 數(shù)據(jù),我們可以看到,我們需要的數(shù)據(jù)都在 app_msg_ext_info 下面。

          fdce35f0788f91d9cbcfec9c366dabb7.webp

          我們用 json.loads 解析返回的 Json 信息,把我們需要的列保存在 csv 文件中,有標(biāo)題、摘要、文章鏈接三列信息,其他信息也可以自己加。

          ????def?parse_data(self,?responseData):
          ????????????all_datas?=?json.loads(responseData)
          ????????????if?0?==?all_datas['ret']?and?all_datas['msg_count']>0:
          ????????????????summy_datas?=?all_datas['general_msg_list']
          ????????????????datas?=?json.loads(summy_datas)['list']
          ????????????????a?=?[]
          ????????????????for?data?in?datas:
          ????????????????????try:
          ????????????????????????title?=?data['app_msg_ext_info']['title']
          ????????????????????????title_child?=?data['app_msg_ext_info']['digest']
          ????????????????????????article_url?=?data['app_msg_ext_info']['content_url']
          ????????????????????????info?=?{}
          ????????????????????????info['標(biāo)題']?=?title
          ????????????????????????info['小標(biāo)題']?=?title_child
          ????????????????????????info['文章鏈接']?=?article_url
          ????????????????????????a.append(info)
          ????????????????????except?Exception?as?e:
          ????????????????????????print(e)
          ????????????????????????continue

          ????????????????print('正在寫入文件')
          ????????????????with?open('Python公眾號文章合集1.csv',?'a',?newline='',?encoding='utf-8')?as?f:
          ????????????????????fieldnames?=?['標(biāo)題',?'小標(biāo)題',?'文章鏈接']??#?控制列的順序
          ????????????????????writer?=?csv.DictWriter(f,?fieldnames=fieldnames)
          ????????????????????writer.writeheader()
          ????????????????????writer.writerows(a)
          ????????????????????print("寫入成功")

          ????????????????print('----------------------------------------')
          ????????????????time.sleep(int(format(random.randint(2,?5))))
          ????????????????self.offset?=?self.offset+10
          ????????????????self.request_data()
          ????????????else:
          ????????????????print('抓取數(shù)據(jù)完畢!')

          這樣,爬取的結(jié)果就會以 csv 格式保存起來。

          運行代碼時,可能會遇到 SSLError 的報錯,最快的解決辦法就是 base_url 前面的 https 去掉 s 再運行。

          保存markdown格式的鏈接

          經(jīng)常寫文章的人應(yīng)該都知道,一般寫文字都會用 Markdown 的格式來寫文章,這樣的話,不管放在哪個平臺,文章的格式都不會變化。

          在 Markdown 格式里,用 [文章標(biāo)題](文章url鏈接) 表示,所以我們保存信息時再加一列信息就行,標(biāo)題和文章鏈接都獲取了,Markdown 格式的 url 也就簡單了。

          md_url?=?'[{}]'.format(title)?+?'({})'.format(article_url)

          爬取完成后,效果如下。

          31d0fcf976b3ffc38d2a784b1e4f676b.webp

          我們把 md鏈接這一列全部粘貼到 Markdown 格式的筆記里就行了,大部分的筆記軟件都知道新建 Markdown 格式的文件的。

          d70cf68ea9e1b04506829023ae95ee64.webp

          這樣,這些導(dǎo)航文章鏈接整理起來就是分類的事情了。

          公眾號后臺輸入內(nèi)輸入「公眾號」獲取本文所有代碼。

          你用 Python 解決過生活中的小問題嗎?歡迎留言討論。

          1280c3b549359761155c0986c3d3689f.webp

          -----------------------公眾號:Python知識圈(ID:PythonCircle博客:www.pyzhishiquan.com知乎:Python知識圈bilibili:菜鳥程序員的日常

          一個學(xué)習(xí)Python的人,喜歡分享,喜歡搞事情!長按下圖二維碼關(guān)注,和你一起領(lǐng)悟Python的魅力


          Python知識圈公眾號的交流群已經(jīng)建立,群里可以領(lǐng)取 Python 和人工智能學(xué)習(xí)資料,大家可以一起學(xué)習(xí)交流,效率更高,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道一定記得備注「交流學(xué)習(xí)」,我會盡快通過好友申請哦!通過好友后私聊我「學(xué)習(xí)資料」或者「進(jìn)群」都可以。

          掃碼添加,備注:交流學(xué)習(xí)




          往期推薦01

          公眾號所有文章匯總導(dǎo)航(2-10更新)

          02

          姍姍來遲的2019年總結(jié),自我審視

          03

          發(fā)現(xiàn) 2 個惡意 Python 第三方庫,大家小心別中招!


          分享給你的朋友

          點個在看

          763fbda7af4bd42a629aa17b5e0e413a.webp

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  网红操逼视频在线观看免费视频在线观看 | 成人网站www污污污网站公司 | 日韩午夜激情电影 | 影音先锋在线看片av一区 | 一本久道AV一区二区三区 |