python採集器
『壹』 python中的網路爬蟲有哪些類型呢
通用網路爬蟲
通用網路爬蟲對於硬體配置的要求比較高,爬行數量和范圍較大,對所爬行頁面的順序並沒有太高的要求,但是由於採用並行工作方式的原因,需要很長時間才可以刷新爬行頁面。
增量式網路爬蟲
增量式網路爬蟲是指只爬行發生變化網頁或者是對已經下載的網頁採取增量更新的爬蟲,這種類型的爬蟲能夠一定的保證爬取頁面的更新。
深層網路爬蟲
深層網頁當中存儲的信息量非常之多,幾乎是表層網頁信息量的數百倍,而深層網路爬蟲則是專門針對深層網頁所開發出的爬蟲程序。
聚焦網路爬蟲
聚焦網路爬蟲是指有針對性的爬取預先設定好的主題相關頁面的網路爬蟲,和通用網路爬蟲相比對於硬體的要求有所降低,而且所抓取的數據垂直性更高,可以滿足一些特定人群的需求。
IPIDEA已向眾多互聯網知名企業提供服務,對提高爬蟲的抓取效率提供幫助,支持API批量使用,支持多線程高並發使用。
『貳』 值得收藏的Python第三方庫
網路站點爬取
爬取網路站點的庫Scrapy – 一個快速高級的屏幕爬取及網頁採集框架。cola – 一個分布式爬蟲框架。Demiurge – 基於PyQuery 的爬蟲微型框架。feedparser – 通用 feed 解析器。Grab – 站點爬取框架。MechanicalSoup – 用於自動和網路站點交互的 Python 庫。portia – Scrapy 可視化爬取。pyspider – 一個強大的爬蟲系統。RoboBrowser – 一個簡單的,Python 風格的庫,用來瀏覽網站,而不需要一個獨立安裝的瀏覽器。
互動式解析器
互動式 Python 解析器。
IPython – 功能豐富的工具,非常有效的使用互動式 Python。
bpython- 界面豐富的 Python 解析器。
ptpython – 高級互動式Python解析器, 構建於python-prompt-toolkit 之上。
圖像處理
用來操作圖像的庫.
pillow – Pillow 是一個更加易用版的 PIL。
hmap – 圖像直方圖映射。
imgSeek – 一個使用視覺相似性搜索一組圖片集合的項目。
nude.py – 裸體檢測。
pyBarcode – 不藉助 PIL 庫在 Python 程序中生成條形碼。
pygram – 類似 Instagram 的圖像濾鏡。
python-qrcode – 一個純 Python 實現的二維碼生成器。
Quads – 基於四叉樹的計算機藝術。
scikit-image – 一個用於(科學)圖像處理的 Python 庫。
thumbor – 一個小型圖像服務,具有剪裁,尺寸重設和翻轉功能。
wand – MagickWand的Python 綁定。MagickWand 是 ImageMagick的 C API 。
HTTP
使用HTTP的庫。
requests – 人性化的HTTP請求庫。
grequests – requests 庫 + gevent ,用於非同步 HTTP 請求.
httplib2 – 全面的 HTTP 客戶端庫。
treq – 類似 requests 的Python API 構建於 Twisted HTTP 客戶端之上。
urllib3 – 一個具有線程安全連接池,支持文件 post,清晰友好的 HTTP 庫。
Python實現的資料庫。
pickleDB – 一個簡單,輕量級鍵值儲存資料庫。
PipelineDB – 流式 SQL 資料庫。
TinyDB – 一個微型的,面向文檔型資料庫。
ZODB – 一個 Python 原生對象資料庫。一個鍵值和對象圖資料庫。
Web 框架
全棧 web 框架。
Django – Python 界最流行的 web 框架。
awesome-django系列
Flask – 一個 Python 微型框架。
https://github.com/humiaozuzu/awesome-flask系列
Pyramid – 一個小巧,快速,接地氣的開源Python web 框架。
awesome-pyramid系列
Bottle – 一個快速小巧,輕量級的 WSGI 微型 web 框架。
CherryPy – 一個極簡的 Python web 框架,服從 HTTP/1.1 協議且具有WSGI 線程池。
TurboGears – 一個可以擴展為全棧解決方案的微型框架。
web.py – 一個 Python 的 web 框架,既簡單,又強大。
web2py – 一個全棧 web 框架和平台,專注於簡單易用。
Tornado – 一個web 框架和非同步網路庫。
HTML處理
處理 HTML和XML的庫。
BeautifulSoup – 以 Python 風格的方式來對 HTML 或 XML 進行迭代,搜索和修改。
bleach – 一個基於白名單的 HTML 清理和文本鏈接庫。
cssutils – 一個 Python 的 CSS 庫。
html5lib – 一個兼容標準的 HTML 文檔和片段解析及序列化庫。
lxml – 一個非常快速,簡單易用,功能齊全的庫,用來處理 HTML 和 XML。
MarkupSafe – 為Python 實現 XML/HTML/XHTML 標記安全字元串。
pyquery – 一個解析 HTML 的庫,類似 jQuery。
untangle – 將XML文檔轉換為Python對象,使其可以方便的訪問。
xhtml2pdf – HTML/CSS 轉 PDF 工具。
xmltodict – 像處理 JSON 一樣處理 XML。
游戲開發
超贊的游戲開發庫。
Cocos2d – cocos2d 是一個用來開發 2D 游戲, 示例和其他圖形/交互應用的框架。基於 pyglet。
Panda3D – 由迪士尼開發的 3D 游戲引擎,並由卡內基梅隴娛樂技術中心負責維護。使用C++編寫, 針對 Python 進行了完全的封裝。
Pygame – Pygame 是一組 Python 模塊,用來編寫游戲。
PyOgre – Ogre 3D 渲染引擎的 Python 綁定,可以用來開發游戲和模擬程序等任何 3D 應用。
PyOpenGL – OpenGL 的 Python 綁定及其相關 APIs。
PySDL2 – SDL2 庫的封裝,基於 ctypes。
RenPy – 一個視覺小說(visual novel)引擎。
『叄』 Python爬蟲實戰(1)requests爬取豆瓣電影TOP250
爬取時間:2020/11/25
系統環境:Windows 10
所用工具:Jupyter NotebookPython 3.0
涉及的庫:requestslxmlpandasmatplotlib
umpy
蛋肥想法: 先將電影名稱、原名、評分、評價人數、分類信息從網站上爬取下來。
蛋肥想法: print數據列表後發現電影原名、分類信息等存在不需要的字元,需預先處理;同時因為後續想做一個豆瓣電影TOP250的維度分布圖,而同一電影存在多個發行國家、類型(如「法國 美國 / 劇情 動作 犯罪」),為了簡(偷)便(懶),這里均取第一個作為記入的數據;最後將數據保存為xlsx。
蛋肥想法: 蛋肥想知道在豆瓣電影TOP250中年份、國家、類型的維度數據,為了練手,使用剛才保存成xlsx的數據,並分別畫成雷達圖、柱形圖、扇形圖。
『肆』 python爬蟲---爬取LOL雲頂之弈數據
本來是想爬取之後作最佳羈絆組合推算,但是遇到知識點無法消化(知識圖譜),所以暫時先不組合了,實力有限
庫的安裝
1.requests #爬取棋子數據
2.json #棋子數據為js動態,需使用json解析
3.BeautifulSoup
實戰前先新建個lol文件夾作為工作目錄,並創建子目錄data,用於存放數據。
1.爬取數據,新建個py文件,用於爬取雲頂數據,命念中塌名為data.py
1.1定義個req函數,方便讀取。//需設定編碼格式,否則會出現亂碼
def Re_data(url):
re = requests.get(url)
re.encoding = 'gbk'
data = json.loads(re.text)
return data['data']
1.2定義個Get函數,用於讀取數據並使用保存函數進行保存數據,保存格式為json。
def Get_data():
# 獲取數據並保存至data目錄
base_url = 'https://game.gtimg.cn/images/lol/act/img/tft/js/'培灶
chess = Re_data(base_url + 'chess.js')
race = Re_data(base_url + 'race.js')
job = Re_data(base_url + 'job.js')
equip = Re_data(base_url + 'equip.js')
Save_data(chess,race,job,equip)
1.3定義save函數實現讀取的數據進行文件保存,保存目錄為工作目錄下的data文件夾仔圓。
def Save_data(t_chess,t_race,t_job,t_equip):
with open('./data/chess.json','w') as f:
json.mp(t_chess,f,indent='\t')
with open('./data/race.json','w') as f:
json.mp(t_race,f,indent='\t')
with open('./data/job.json','w') as f:
json.mp(t_job,f,indent='\t')
with open('./data/equip.json','w') as f:
json.mp(t_equip,f,indent='\t')
1.4定義主函數main跑起來
if __name__ == '__main__':
start = time.time()
Get_data()
print('運行時間:' + str(time.time() - start) + '秒')
至此,數據爬取完成。
2.種族和職業進行組合。
2.1未完成 //未完成,使用窮舉方法進行組合會出現內存不夠導致組合失敗(for循環嵌套導致數組內存超限)
//待學習,使用知識圖譜建立組合優選,可參考:https://ya360.com/12447.html
期間遇到的問題:
1.爬取棋子數據時為動態js載入,需通過json模塊的loads方法獲取
2.3層for循環嵌套數據量大,導致計算失敗,需優化計算方法。
『伍』 python如何能採集多個攝像頭的數據
可以,用PYQT+CV2,四個USB連接成功,程序如下,UI要自己搞了,放不下
# -*- coding: utf-8 -*-
import sys#, time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer, QThread, pyqtSignal
from Ui_cv2ui_thread import Ui_MainWindow
import cv2 as cv
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import (QApplication, QDialog, QFileDialog, QGridLayout,
QLabel, QPushButton, QColorDialog)
import numpy as np
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent=parent)
self.setupUi(self) #這個一定要在這個最前面位置
# define the slot for pushbutton to save the merged image
self.pushButton.clicked.connect(self.savemergeimage)
self.img = np.ndarray(()) #空的numpy array
self.img1 = np.ndarray(())
self.img2= np.ndarray(())
self.img3= np.ndarray(())
self.img4= np.ndarray(())
self.img4= np.empty([960,1280, 3], int)
self.cap = cv.VideoCapture(3) #注意,由大開到小,很重要
self.cap.set(3, 640) # setup the resolution of CCD
self.cap.set(4, 480)
ret, self.img=self.cap.read()
self.cap1 = cv.VideoCapture(2)
self.cap1.set(3, 640)
self.cap1.set(4, 480)
ret, self.img1=self.cap1.read()
self.cap2 = cv.VideoCapture(1)
self.cap2.set(3, 640)
self.cap2.set(4, 480)
ret, self.img2=self.cap2.read()
self.cap3 = cv.VideoCapture(0)
self.cap3.set(3, 640)
self.cap3.set(4, 480)
ret, self.img3=self.cap3.read()
#time.sleep(1)也許需要延遲,等他准備好
# 初始化一個定時器,在其他條件下用的
#self.timer = QTimer(self)
# 實例化一個線程
self.work0= WorkThread()
self.work0.trigger.connect(self.ccd2)
# 定義時間任務是一次性任務就設定下一行
#self.timer.setSingleShot(True)
# 啟動時間任務,注意一致性
self.work0.start()
# 實例化一個線程
self.work= WorkThread()
# 多線程的信號觸發連接到ccd3
self.work.trigger.connect(self.ccd3)
self.work.start()
# 實例化一個線程
self.work2 = WorkThread()
# 多線程的信號觸發連接到ccd4
self.work2.trigger.connect(self.ccd4)
self.work2.start()
# 實例化一個線程
self.work3 = WorkThread()
# 多線程的信號觸發連接到ccd1
self.work3.trigger.connect(self.ccdmerge)
self.work3.start()
self.work4 = WorkThread()
# 多線程的信號觸發連接到ccd1
self.work4.trigger.connect(self.ccd1)
self.work4.start()
def refreshShowa(self):#顯示ccd1到label1
# 提取圖像的尺寸和通道, 用於將opencv下的image轉換成Qimage
height, width, channel = self.img.shape
bytesPerLine = 3 * width
self.qImg = QImage(self.img.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label.setPixmap(QPixmap.fromImage(self.qImg))
def refreshShowb(self):#顯示ccd2到label2
# 提取圖像的尺寸和通道, 用於將opencv下的image轉換成Qimage
height, width, channel = self.img1.shape
bytesPerLine = 3 * width
self.qImg1 = QImage(self.img1.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_2.setPixmap(QPixmap.fromImage( self.qImg1))
def refreshShowc(self):#顯示ccd3到label3
# 提取圖像的尺寸和通道, 用於將opencv下的image轉換成Qimage
height, width, channel = self.img2.shape
bytesPerLine = 3 * width
self.qImg2 = QImage(self.img2.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_3.setPixmap(QPixmap.fromImage( self.qImg2))
def refreshShowd(self):#顯示ccd4到label4
# 提取圖像的尺寸和通道, 用於將opencv下的image轉換成Qimage
height, width, channel = self.img3.shape
bytesPerLine = 3 * width
self.qImg3 = QImage(self.img3.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_4.setPixmap(QPixmap.fromImage( self.qImg3))
def refreshShowe(self):#顯示合並的影像到label6
# 提取圖像的尺寸和通道, 用於將opencv下的image轉換成Qimage
height, width, channel = self.img4.shape
bytesPerLine = 3 * width
self.qImg4 = QImage(self.img4.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_6.setPixmap(QPixmap.fromImage( self.qImg4))
def ccd1(self):
self.cap.set(3, 640)
self.cap.set(4, 480)
ret, self.img = self.cap.read()
self.refreshShowa()
# 啟動另一個線程
self.work0.start()#注意一致性
def ccd2(self, str):
self.cap1.set(3, 640)
self.cap1.set(4, 480)
ret, self.img1 = self.cap1.read()
self.refreshShowb()
self.work.start()#注意一致性
def ccd3(self, str):
self.cap2.set(3, 640)
self.cap2.set(4, 480)
ret, self.img2= self.cap2.read()
self.refreshShowc()
self.work2.start()#注意一致性
def ccd4(self, str):
self.cap3.set(3, 640)
self.cap3.set(4, 480)
ret, self.img3 = self.cap3.read()
self.refreshShowd()
self.work3.start()#注意一致性
def ccdmerge(self, str):
self.img4=np.hstack((self.img, self.img1))
self.img4=np.vstack((self.img4, np.hstack((self.img2, self.img3))))
#print ('here is a merge process') 可以用來判斷多線程的執行
self.refreshShowe() #later to remove the remark
self.work4.start()#注意一致性
def savemergeimage(self):
# 調用存儲文件dialog
fileName, tmp = QFileDialog.getSaveFileName(
self, 'Save Image', './__data', '*.png *.jpg *.bmp', '*.png')
if fileName == '':
return
if self.img.size == 1:
return
# 調用opencv寫入圖像
cv.imwrite(fileName,self.img4)
class WorkThread(QThread): #多線程核心,非常重要
# 定義一個信號
trigger = pyqtSignal(str)
def __int__(self):
# 初始化函數,默認
super(WorkThread, self).__init__()
def run(self):
self.trigger.emit('')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
『陸』 python怎麼抓取微信閱
抓取微信公眾號的文章
一.思路分析
目前所知曉的能夠抓取的方法有:
1、微信APP中微信公眾號文章鏈接的直接抓取(http://mp.weixin.qq.com/s?__biz=MjM5MzU4ODk2MA==&mid=2735446906&idx=1&sn=&scene=0#rd)
2、通過微信合作方搜狗搜索引擎(http://weixin.sogou.com/),發送相應請求來間接抓取
第1種方法中,這種鏈接不太好獲取,而且他的規律不是特別清晰。
因此本文採用的是方法2----通過給 weixin.sogou.com 發送即時請求來實時解析抓取數據並保存到本地。
二.爬取過程
1、首先在搜狗的微信搜索頁面測試一下,這樣能夠讓我們的思路更加清晰
在搜索引擎上使用微信公眾號英文名進行「搜公眾號」操作(因為公眾號英文名是公眾號唯一的,而中文名可能會有重復,同時公眾號名字一定要完全正確,不然可能搜到很多東西,這樣我們可以減少數據的篩選工作,只要找到這個唯一英文名對應的那條數據即可),即發送請求到'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&_sug_=n&_sug_type_= ' % 'python',並從頁面中解析出搜索結果公眾號對應的主頁跳轉鏈接。
2.獲取主頁入口內容
使用request , urllib,urllib2,或者直接使用webdriver+phantomjs等都可以
這里使用的是request.get()的方法獲取入口網頁內容
[python]view plain
#爬蟲偽裝頭部設置
self.headers={'User-Agent':'Mozilla/5.0(WindowsNT6.3;WOW64;rv:51.0)Gecko/20100101Firefox/51.0'}
#設置操作超時時長
self.timeout=5
#爬蟲模擬在一個request.session中完成
self.s=requests.Session()
#搜索入口地址,以公眾為關鍵字搜索該公眾號
defget_search_result_by_keywords(self):
self.log('搜索地址為:%s'%self.sogou_search_url)
returnself.s.get(self.sogou_search_url,headers=self.headers,timeout=self.timeout).content
#獲得公眾號主頁地址
defget_wx_url_by_sougou_search_html(self,sougou_search_html):
doc=pq(sougou_search_html)
#printdoc('p[class="tit"]')('a').attr('href')
#printdoc('div[class=img-box]')('a').attr('href')
#通過pyquery的方式處理網頁內容,類似用beautifulsoup,但是pyquery和jQuery的方法類似,找到公眾號主頁地址
returndoc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
#使用webdriver載入公眾號主頁內容,主要是js渲染的部分
defget_selenium_js_html(self,url):
browser=webdriver.PhantomJS()
browser.get(url)
time.sleep(3)
#執行js得到整個頁面內容
html=browser.execute_script("returndocument.documentElement.outerHTML")
returnhtml
#獲取公眾號文章內容
defparse_wx_articles_by_html(self,selenium_html):
doc=pq(selenium_html)
print'開始查找內容msg'
returndoc('div[class="weui_media_boxappmsg"]')
#有的公眾號僅僅有10篇文章,有的可能多一點
#returndoc('div[class="weui_msg_card"]')#公眾號只有10篇文章文章的
#!/usr/bin/python
#coding:utf-8
importsys
reload(sys)
sys.setdefaultencoding('utf-8')
fromurllibimportquote
frompyqueryimportPyQueryaspq
fromseleniumimportwebdriver
importrequests
importtime
importre
importjson
importos
classweixin_spider:
def__init__(self,kw):
'構造函數'
self.kw=kw
#搜狐微信搜索鏈接
#self.sogou_search_url='http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&_sug_=n&_sug_type_='%quote(self.kw)
self.sogou_search_url='http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_='%quote(self.kw)
#爬蟲偽裝
self.headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:47.0)Gecko/20100101FirePHP/0refox/47.0FirePHP/0.7.4.1'}
#操作超時時長
self.timeout=5
self.s=requests.Session()
defget_search_result_by_kw(self):
self.log('搜索地址為:%s'%self.sogou_search_url)
returnself.s.get(self.sogou_search_url,headers=self.headers,timeout=self.timeout).content
defget_wx_url_by_sougou_search_html(self,sougou_search_html):
'根據返回sougou_search_html,從中獲取公眾號主頁鏈接'
doc=pq(sougou_search_html)
#printdoc('p[class="tit"]')('a').attr('href')
#printdoc('div[class=img-box]')('a').attr('href')
#通過pyquery的方式處理網頁內容,類似用beautifulsoup,但是pyquery和jQuery的方法類似,找到公眾號主頁地址
returndoc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
defget_selenium_js_html(self,wx_url):
'執行js渲染內容,並返回渲染後的html內容'
browser=webdriver.PhantomJS()
browser.get(wx_url)
time.sleep(3)
#執行js得到整個dom
html=browser.execute_script("returndocument.documentElement.outerHTML")
returnhtml
defparse_wx_articles_by_html(self,selenium_html):
'從selenium_html中解析出微信公眾號文章'
doc=pq(selenium_html)
returndoc('div[class="weui_msg_card"]')
defswitch_arctiles_to_list(self,articles):
'把articles轉換成數據字典'
articles_list=[]
i=1
ifarticles:
forarticleinarticles.items():
self.log(u'開始整合(%d/%d)'%(i,len(articles)))
articles_list.append(self.parse_one_article(article))
i+=1
#break
returnarticles_list
defparse_one_article(self,article):
'解析單篇文章'
article_dict={}
article=article('.weui_media_box[id]')
title=article('h4[class="weui_media_title"]').text()
self.log('標題是:%s'%title)
url='http://mp.weixin.qq.com'+article('h4[class="weui_media_title"]').attr('hrefs')
self.log('地址為:%s'%url)
summary=article('.weui_media_desc').text()
self.log('文章簡述:%s'%summary)
date=article('.weui_media_extra_info').text()
self.log('發表時間為:%s'%date)
pic=self.parse_cover_pic(article)
content=self.parse_content_by_url(url).html()
contentfiletitle=self.kw+'/'+title+'_'+date+'.html'
self.save_content_file(contentfiletitle,content)
return{
'title':title,
'url':url,
'summary':summary,
'date':date,
'pic':pic,
'content':content
}
defparse_cover_pic(self,article):
'解析文章封面圖片'
pic=article('.weui_media_hd').attr('style')
p=re.compile(r'background-image:url(.∗?)')
rs=p.findall(pic)
self.log('封面圖片是:%s'%rs[0]iflen(rs)>0else'')
returnrs[0]iflen(rs)>0else''
defparse_content_by_url(self,url):
'獲取文章詳情內容'
page_html=self.get_selenium_js_html(url)
returnpq(page_html)('#js_content')
defsave_content_file(self,title,content):
'頁面內容寫入文件'
withopen(title,'w')asf:
f.write(content)
defsave_file(self,content):
'數據寫入文件'
withopen(self.kw+'/'+self.kw+'.txt','w')asf:
f.write(content)
deflog(self,msg):
'自定義log函數'
printu'%s:%s'%(time.strftime('%Y-%m-%d%H:%M:%S'),msg)
defneed_verify(self,selenium_html):
'有時候對方會封鎖ip,這里做一下判斷,檢測html中是否包含id=verify_change的標簽,有的話,代表被重定向了,提醒過一陣子重試'
returnpq(selenium_html)('#verify_change').text()!=''
defcreate_dir(self):
'創建文件夾'
ifnotos.path.exists(self.kw):
os.makedirs(self.kw)
defrun(self):
'爬蟲入口函數'
#Step0:創建公眾號命名的文件夾
self.create_dir()
#Step1:GET請求到搜狗微信引擎,以微信公眾號英文名稱作為查詢關鍵字
self.log(u'開始獲取,微信公眾號英文名為:%s'%self.kw)
self.log(u'開始調用sougou搜索引擎')
sougou_search_html=self.get_search_result_by_kw()
#Step2:從搜索結果頁中解析出公眾號主頁鏈接
self.log(u'獲取sougou_search_html成功,開始抓取公眾號對應的主頁wx_url')
wx_url=self.get_wx_url_by_sougou_search_html(sougou_search_html)
self.log(u'獲取wx_url成功,%s'%wx_url)
#Step3:Selenium+PhantomJs獲取js非同步載入渲染後的html
self.log(u'開始調用selenium渲染html')
selenium_html=self.get_selenium_js_html(wx_url)
#Step4:檢測目標網站是否進行了封鎖
ifself.need_verify(selenium_html):
self.log(u'爬蟲被目標網站封鎖,請稍後再試')
else:
#Step5:使用PyQuery,從Step3獲取的html中解析出公眾號文章列表的數據
self.log(u'調用selenium渲染html完成,開始解析公眾號文章')
articles=self.parse_wx_articles_by_html(selenium_html)
self.log(u'抓取到微信文章%d篇'%len(articles))
#Step6:把微信文章數據封裝成字典的list
self.log(u'開始整合微信文章數據為字典')
articles_list=self.switch_arctiles_to_list(articles)
#Step7:把Step5的字典list轉換為Json
self.log(u'整合完成,開始轉換為json')
data_json=json.mps(articles_list)
#Step8:寫文件
self.log(u'轉換為json完成,開始保存json數據到文件')
self.save_file(data_json)
self.log(u'保存完成,程序結束')
#main
if__name__=='__main__':
gongzhonghao=raw_input(u'輸入要爬取的公眾號')
ifnotgongzhonghao:
gongzhonghao='python6359'
weixin_spider(gongzhonghao).run()
#!/usr/bin/python
#coding:utf-8
[python]view plain
3.獲取公眾號地址
從獲取到的網頁內容中,得到公眾號主頁地址, 這一步驟有很多方法, beautifulsoup、webdriver,直接使用正則,pyquery等都可以
這里使用的是pyquery的方法來查找公眾號主頁入口地址
[python]view plain
4.獲取公眾號主頁的文章列表
首先需要載入公眾號主頁,這里用的是phantomjs+webdriver, 因為這個主頁的內容需要JS 渲染載入,採用之前的方法只能獲得靜態的網頁內容
[python]view plain
得到主頁內容之後,獲取文章列表,這個文章列表中有我們需要的內容
[python]view plain
5.解析每一個文章列表,獲取我們需要的信息
6.處理對應的內容
包括文章名字,地址,簡介,發表時間等
7.保存文章內容
以html的格式保存到本地
同時將上一步驟的內容保存成excel 的格式
8.保存json數據
這樣,每一步拆分完,爬取公眾號的文章就不是特別難了。
三、源碼
第一版源碼如下:
[python]view plain
第二版代碼:
對代碼進行了一些優化和整改,主要:
1.增加了excel存貯
2.對獲取文章內容規則進行修改
3.豐富了注釋
本程序已知缺陷: 如果公眾號的文章內容包括視視頻,可能會報錯。
[python]view plain