壹、思維分析
目前能搶到的方法有:
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?