當前位置:成語大全網 - 書法字典 - python如何抓取微信閱讀?

python如何抓取微信閱讀?

搶微信微信官方賬號的文章

壹、思維分析

目前能搶到的方法有:

1.直接在微信APP中抓取微信微信官方賬號文章的鏈接(/s?_ _ biz = mjm 5 mzu 4 odk 2ma = = & amp;mid=2735446906。idx=1。sn = ECE 37 deaba 0 c 8 ebb 9 badf 07 e 5a 3 BD 3 & amp;場景=0#rd)

2.通過微信合作夥伴搜狗搜索引擎(/)發送相應請求,間接抓取。

在1法中,這種鏈接不容易獲得,其規律也不是特別清晰。

因此,本文采用方法2——通過向weixin.sogou.com發送即時請求來實時分析捕獲的數據,並將其保存在本地。

2.爬行過程

1.首先,讓我們在搜狗的微信搜索頁面上測試壹下,這樣會讓我們的思路更清晰。

使用微信微信官方賬號在搜索引擎上的英文名“搜索微信官方賬號”(因為微信官方賬號的英文名在微信官方賬號中是唯壹的,而且中文名字可能會重復,微信官方賬號的名字必須完全正確,否則可能會發現很多東西,這樣可以減少數據篩選工作,只需找到這個唯壹英文名對應的數據即可),即向'/weixin發送請求?type = 1 & amp;查詢= % s & ampie = utf8 & amp_ sug _ = n & amp_sug_type_= ' %?Python ',並從頁面解析出搜索結果微信官方賬號對應的首頁跳轉鏈接。

2.獲取主頁條目內容

使用request,urllib,urllib2,或者直接使用webdriver+phantomjs等。

這裏使用request.get()方法來獲取門戶頁面的內容。

【python】?觀平原?復制

#?履帶偽裝頭設置?

self.headers?=?{ '用戶代理':?Mozilla/5.0?(Windows?NT?6.3;?WOW64?rv:51.0)?壁虎/20100101?火狐/51.0'}?

#?設置操作超時?

self .超時?=?5?

#?Crawler模擬在請求中完成。會話?

self.s?=?請求。會話()?

【python】?觀平原?復制

#搜索入口地址,以公眾為關鍵詞搜索微信官方賬號?

def?get_search_result_by_keywords(自身):?

Self.log('搜索地址:%s '?%?self.sogou_search_url)?

回歸?self.s.get(self .搜狗_搜索_網址,?headers=self.headers,?timeout=self.timeout)。內容?

第三步獲取微信官方賬號地址。

從獲取的網頁內容中獲取微信官方賬號首頁地址的方法有很多,比如beautifulsoup、webdriver、直接使用Regularity、pyquery等。

這裏用pyquery來查找微信官方賬號首頁的入口地址。

【python】?觀平原?復制

#獲取微信官方賬號首頁地址?

def?get _ wx _ URL _ by _ sou Gou _ search _ html(self,sougou _ search _ html):?

醫生。=?pq(sougou_search_html)?

#打印?doc('p[class="tit"]')('a ')。attr('href ')?

#打印?doc('div[class=img-box]')('a ')。attr('href ')?

#用pyquery的方式處理網頁內容,類似於使用beautifulsoup,但是pyquery和jQuery的方法類似。找到微信官方賬號的首頁地址?

回歸?doc(' div[class = txt-box]')(' p[class = tit]')(' a ')。attr('href ')?

4.獲取微信官方賬號首頁文章列表。

首先妳需要加載微信官方賬號首頁。這裏用的是phantomjs+webdriver,因為這個主頁的內容需要js渲染和加載,用前面的方法只能得到靜態的網頁內容。

【python】?觀平原?復制

#使用webdriver?加載微信官方賬號首頁的內容,主要是js渲染的部分?

def?get_selenium_js_html(self,?網址):?

瀏覽器?=?webdriver。幻象()

browser.get(url)

時間.睡眠(3)

#?執行js獲取整個頁面內容?

html?=?browser.execute_script("return?document . document element . outer html ")?

回歸?html?

得到首頁內容後,得到文章列表,裏面有我們需要的內容。

【python】?觀平原?復制

#獲取微信官方賬號的文章內容?

def?parse_wx_articles_by_html(self,?selenium_html):?

醫生。=?pq(selenium_html)?

打印?開始尋找內容信息?

回歸?doc('div[class="weui_media_box?appmsg"]')?

#有的微信官方賬號只有10條,有的可能更多?

#回歸?doc(' div[class = " weui _ msg _ card "]')#微信官方賬號只有10條?

5.分析每個文章列表以獲得我們需要的信息。

6.處理相應的內容

包括文章名稱、地址、簡介、發表時間等。

7.保存文章的內容

以html格式保存在本地。

同時,將上壹步的內容保存為excel格式。

8.保存json數據

這樣,每壹步拆分後,抓取微信官方賬號的文章也不是特別難。

第三,源代碼

第壹版的源代碼如下:

【python】?觀平原?復制

#!/usr/bin/python?

#?編碼:?utf-8?

進口?sys?

重新加載(系統)?

sys.setdefaultencoding('utf-8 ')?

從哪裏?urllib?進口?引用?

從哪裏?pyquery?進口?PyQuery?作為?pq?

從哪裏?硒?進口?webdriver?

進口?請求?

進口?時間?

進口?re?

進口?json?

進口?os?

班級?微信_蜘蛛:?

def?__init__(self,kw):?

?“建造者,”?

self.kw?=?kw?

#?搜狐微信搜索鏈接?

#self.sogou_search_url?=?/威信?type = 1 & amp;查詢= % s & ampie = utf8 & amp_ sug _ = n & amp_sug_type_= '?%?報價(self.kw)?

self.sogou_search_url?=?/威信?type = 1 & amp;查詢= % s & ampie = utf8 & amp輸入& amp_ sug _ = n & amp_sug_type_= '?%?報價(self.kw)?

#?爬蟲偽裝?

self.headers?=?{ '用戶代理':?Mozilla/5.0?(Windows?NT?10.0;?WOW64?rv:47.0)?壁虎/20100101?FirePHP/0refox/47.0?FirePHP/0.7.4.1'}?

#?操作超時多長時間?

self .超時?=?5?

self.s?=?請求。會話()?

def?get_search_result_by_kw(self):?

Self.log('搜索地址:%s '?%?self.sogou_search_url)?

回歸?self.s.get(self .搜狗_搜索_網址,?headers=self.headers,?timeout=self.timeout)。內容?

def?get _ wx _ URL _ by _ sou Gou _ search _ html(self,sougou _ search _ html):?

?'根據返回的sougou_search_html,從中獲取微信官方賬號首頁鏈接?'?

醫生。=?pq(sougou_search_html)?

#打印?doc('p[class="tit"]')('a ')。attr('href ')?

#打印?doc('div[class=img-box]')('a ')。attr('href ')?

#用pyquery的方式處理網頁內容,類似於使用beautifulsoup,但是pyquery和jQuery的方法類似。找到微信官方賬號的首頁地址?

回歸?doc(' div[class = txt-box]')(' p[class = tit]')(' a ')。attr('href ')?

def?get_selenium_js_html(self,?wx_url):?

?'執行js渲染內容並返回渲染後的html內容?'?

瀏覽器?=?webdriver。幻象()

browser.get(wx_url)

時間.睡眠(3)

#?執行js獲得整個dom。

html?=?browser.execute_script("return?document . document element . outer html ")?

回歸?html?

def?parse_wx_articles_by_html(self,?selenium_html):?

?'從selenium_html解析微信微信官方賬號文章?'?

醫生。=?pq(selenium_html)?

回歸?doc(' div[class = " weui _ msg _ card "]')?

def?switch _ arcticles _ to _ list(self,文章):?

?將文章轉換成數據字典??

文章_列表?=?[]?

我?=?1?

如果?文章:?

為了什麽?文章?在?articles.items():?

self . log(u ' start integration(% d/% d)'?%?(我,?len(articles)))?

articles _ list . append(self . parse _ one _ article(article))?

我?+=?1?

#?決裂?

回歸?文章_列表?

def?parse_one_article(self,?文章):?

?分析壹篇文章??

文章_字典?=?{}?

文章?=?文章('。weui_media_box[id]')?

標題?=?文章(' h4[class="weui_media_title"]')。text()?

Self.log('標題是:?“%s”嗎?%?標題)?

網址?=?''?+?文章(' h4[class="weui_media_title"]')。attr(' href ')?

Self.log('地址:?“%s”嗎?%?網址)?

總結?=?文章('。desc媒體協會)。text()?

Self.log('文章簡介:?“%s”嗎?%?總結)?

約會?=?文章('。weui _ media _ extra _ info’)。text()?

Self.log('發布於:?“%s”嗎?%?日期)?

pic?=?self.parse_cover_pic(文章)?

內容?=?self.parse_content_by_url(網址)。html()?

content file title = self . kw+'/'+title+' _ '+date+'。html '?

self . save _ content _ file(content file title,content)?

回歸?{?

標題':標題,?

網址':網址,?

總結':總結壹下,?

日期':日期,?

pic ':pic,?

內容':內容?

}?

def?parse_cover_pic(self,?文章):?

?'分析文章的封面圖片?'?

pic?=?文章('。weui _ media _ HD’)。attr('style ')?

p?=?重新編譯(r'background-image:url(。?)')?

rs?=?p.findall(pic)?

self.log(?封面圖片是:%s??%?rs[0]?如果?len(rs)?& gt?0?“否則,”')?

回歸?rs[0]?如果?len(rs)?& gt?0?不然呢?''?

def?parse_content_by_url(self,網址):?

?“了解文章的詳細內容嗎?”?

page_html?=?self.get_selenium_js_html(網址)?

回歸?pq(page_html)('#js_content ')?

def?save_content_file(自己,標題,內容):?

?'將頁面內容寫入文件?'?

用什麽?打開(標題,?w’)?作為?f:?

f.write(內容)?

def?save_file(self,內容):?

?'將數據寫入文件?'?

用什麽?open(self.kw+'/'+self.kw+'。' txt ',?w’)?作為?f:?

f.write(內容)?

def?日誌(自己,?msg):?

?“自定義日誌功能?”?

打印?u“% s:?“%s”嗎?%?(time.strftime('%Y-%m-%d?%H:%M:%S '),?味精)?

def?需要_驗證(自我,selenium_html):?

?有時候對方會屏蔽ip。我們在這裏做壹個判斷,檢查html是否包含id=verify_change的標簽。如果是,則意味著它已經被重定向。“提醒您稍後再試,”?

回歸?pq(selenium _ html)(' # verify _ change ')。text()?!=?''?

def?create_dir(自我):?

創建壹個文件夾?

如果?不是嗎?os.path.exists(self.kw):

os.makedirs(self.kw)

def?跑(自己):?

?“爬蟲入口功能?”?

#步?0?:?創建以微信官方賬號命名的文件夾?

self.create_dir()?

#?壹步?1: GET請求到搜狗微信引擎,以微信微信官方賬號的英文名稱為查詢關鍵字?

Self.log(u '開始get,微信微信官方賬號英文名稱為:%s '?%?self.kw)?

Self.log(u '開始調用搜狗搜索引擎')?

sougou_search_html?=?self.get_search_result_by_kw()?

#?壹步?2.從搜索結果頁面解析微信官方賬號首頁鏈接?

Self.log(u '成功獲取sougou_search_html,開始抓取微信官方賬號對應首頁wx_url ')?

wx_url?=?self . get _ wx _ URL _ by _ sou Gou _ search _ html(sou Gou _ search _ html)?

Self.log(u '成功獲取wx_url,%s '?%?wx_url)?

#?壹步?3: 3:Selenium+PhantomJs來獲取Js異步加載的渲染html?

Self.log(u '開始調用selenium渲染html ')?

硒_html?=?self . get _ selenium _ js _ html(wx _ URL)?

#?壹步?4:?檢測目標網站是否被阻止?

如果?self.need_verify(selenium_html):?

Self.log(u '爬蟲被目標網站屏蔽,請稍後再試')?

否則:?

#?壹步?5:?使用PyQuery,來自步驟?3.從獲取的html中解析微信官方賬號的文章列表的數據?

Self.log(u '調用selenium渲染html,開始解析微信官方賬號的文章')?

文章?=?self . parse _ wx _ articles _ by _ html(selenium _ html)?

Self.log(妳有%d篇微信文章)?%?len(文章))?

#?壹步?6:?把微信文章的數據封裝成字典的列表?

Self.log(u '開始把微信文章的數據整合成壹本字典')?

文章_列表?=?self.switch _ arctiles _ to _ list(文章)?

#?壹步?7:?放步?5的字典列表轉換成Json了嗎?

Self.log(u '集成完成,開始轉換為json ')?

data_json?=?json.dumps(articles_list)?

#?壹步?8:?寫文檔?

Self.log(u '轉換成json,開始保存json數據到文件')?

self.save_file(data_json)?

Self.log(u '保存完成,程序結束')?

#?主要?

如果?__name__?==?__main__ ':?

Gongzhonghao=raw_input(u '進入微信官方賬號爬')?

如果?不是嗎?宮中豪:?

龔中豪='python6359 '?

weixin_spider(龔中豪)。run()?

第二個版本的代碼:

對代碼進行了優化和整改,主要是:

1.添加了excel存儲。

2.修改獲取文章內容的規則。

3.豐富了筆記

這個程序有壹個已知的缺陷:如果微信官方賬號的文章包含視頻,可能會被報錯。

【python】?觀平原?復制

#!/usr/bin/python?

#?編碼:?utf-8?