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