當前位置:股票大全官網 - 資訊咨詢 - 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?Firefox/51.0'}

#?設置操作超時時間。

self .超時?=?五

#?Crawler模擬在request.session中完成

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(搜購_搜索_html)

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

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

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

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

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

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

【python】?觀平原?復制

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

def?get_selenium_js_html(self,?網址):

瀏覽器?=?webdriver。PhantomJS()?

browser.get(網址)?

time.sleep(3)?

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

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

回歸?超文本標記語言

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

【python】?觀平原?復制

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

def?parse_wx_articles_by_html(self,?selenium_html):

醫生。=?pq(硒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

進口?[計]系統復制命令(system的簡寫)

重新加載(系統)

sys.setdefaultencoding('utf-8 ')

從哪裏?urllib?進口?引用

從哪裏?pyquery?進口?PyQuery?作為?體能商數

從哪裏?硒?進口?網絡驅動

進口?要求

進口?時間

進口?關於

進口?json

進口?操作系統(Operating System)

班級?微信_蜘蛛:

def?__init__(self,千瓦):

?“建造者,”

self.kw?=?千瓦

#?搜狐微信搜索鏈接

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

self.sogou_search_url?=?/威信?type = 1 & amp;查詢= % s & ampie = utf8 & amp輸入& amp= n & amp_sug_type_= '?%?報價(自我千瓦)

#?爬行動物偽裝

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

#?操作超時持續時間

self .超時?=?五

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

def?get_search_result_by_kw(自身):

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(搜購_搜索_html)

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

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

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

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

def?get_selenium_js_html(self,?wx_url):

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

瀏覽器?=?webdriver。PhantomJS()?

browser.get(wx_url)?

time.sleep(3)?

#?執行js得到整個dom?

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

回歸?超文本標記語言

def?parse_wx_articles_by_html(self,?selenium_html):

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

醫生。=?pq(硒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 _ list . append(self . parse _ one _ article(article))

我?+=?1

#?破裂

回歸?文章_列表

def?parse_one_article(self,?文章):

?分析壹篇文章?

文章_字典?=?{}

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

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

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

網址?=?''?+?文章(' h4[class="weui_media_title"]')。屬性(' hrefs ')

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

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

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

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

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(內容文件標題,內容)

回歸?{

標題':標題,

網址':url,

總結':總結,

日期':日期,

pic ':pic,

內容':內容

}

def?parse_cover_pic(self,?文章):

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

pic?=?文章('。weui _ media _ HD’)。屬性('樣式')

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

rs?=?p.findall(圖片)

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.write(內容)

def?save_file(self,內容):

?'將數據寫入文件?'

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

f.write(內容)

def?日誌(自己,?味精):

?“自定義日誌功能?”

打印?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?創建目錄(自己):

'創建文件夾'

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

os.makedirs(self.kw)?

def?運行(自我):

?“爬蟲入口功能?”

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

self.create_dir()

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

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 _ Sogou _ search _ html(Sogou _ 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' crawler被目標網站屏蔽,請稍後再試')

否則:

#?壹步?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數據保存到file ')。

self.save_file

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

#?主要的

如果?__name__?==?__main__ ':

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

如果?不是嗎?宮中昊:

公眾號='python6359 '

weixin_spider(龔中豪)。運行()

第二個版本的代碼:

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

1.添加了excel存儲。

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

3.豐富了筆記

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

【python】?觀平原?復制

#!/usr/bin/python

#?編碼:?utf-8