因此,根據這三步,咱們要下載一些第三方庫,也就是請求庫,解析庫,數據庫.html
常常聽有人說:人生苦短,我用Pythonpython
我想這大概是由於Python有衆多的第三方庫,別人已經寫好了,你調用就完事了git
下面是爬蟲所須要的一些第三方庫的安裝,大部分可使用pip安裝,少數須要去官網下載github
pip是什麼?超級爽的包管理工具,能夠理解爲手機上的應用商店web
Requests是一個請求庫,阻塞式的.意思就是你在請求瀏覽器的時候,只能等,期間什麼都作不了,效率很低很低的mongodb
pip install Requests #Request庫安裝
pip install selenium #selenium庫安裝
安裝完selenium以後,下載ChromeDriverChromeDriver下載,其餘瀏覽器也有驅動,可是我只用Chrome,根據你的Chrome瀏覽器版本下載對應的Driver,而後把Driver放到Python安裝目錄的Scripts目錄下便可.使用where python便可查看安裝目錄chrome
在Python文件中輸入如下,運行,會啓動Chrome窗口數據庫
from selenium import webdriver browser = webdriver.Chrome()
==若是彈窗一閃而退了,說明版本有問題,若是Chrome版本的Driver沒有,恭喜你,遇到了和我同樣的問題,緣由大概是由於新版的Chrome瀏覽器實現了隱藏窗口,由於你爬蟲的時候,總開個瀏覽器窗口也不是個事==npm
上面說到,最新版的Chrome瀏覽器支持隱藏窗口,其實使用PhantomJS也能夠實現隱藏窗口.Selenium是支持PhantomJS的,支持不一樣的瀏覽器,很方便
PhantomJS竟然不支持pip安裝,真是詫異,那就在官網下載吧.下載完成以後打開bin文件夾,有一個phantomjs.exe,仍是個小白布精靈圖標好可愛~和ChromeDriver同樣,把這個exe放到Python的Scripts目錄便可
檢測安裝很簡單,直接在終端打PhantomJS便可,若是進去了就ok,ctrl+d退出
from selenium import webdriver browser = webdriver.PhantomJS() browser.get('https://www.baidu.com') print (browser.current_url)
異步請求庫,和Requests恰好相反,在請求的時候,在瀏覽器還沒搭理你的時候,能夠乾點其餘的事.在爬蟲後期的代理中,用處很是大
pip install aiohttp #aiohttp官方推薦再下載兩個相關庫,不下也沒事 #cchardet是字符編碼檢測庫,aiodns是加速DNS解析庫 pip install cchardet aiodns
安裝完上面的請求庫以後,咱們能夠獲取大量的網頁數據了,可是怎麼提取咱們想要的數據呢?這就要使用解析庫了,很是強大
解析HTML和XML的一個解析庫,支持XPath解析方式
pip install lxml
解析HTML和XML的一個解析庫,具備強大的API和多樣的解析樣式
pip install bs4
from bs4 import BeautifulSoup soup = BeautifulSoup('<p>Hello</p>','lxml') print (soup.p.string)
輸出hello代表安裝成功
==我有一個重要的提醒,在獲取文本信息的時候,不要使用string,最好使用get_text()==
#BeautifulSoup初始化能夠自動更正HTML格式,補全沒有閉合的元素 print (soup.prettify())#以標準的縮進格式輸出 print(soup.title)#標題 print(soup.title.string)#標題裏面的內容 print(soup.title.name)#title的節點名稱,就是title print(soup.p)#第一個p元素的內容 print(soup.p.attrs)#第一個p元素的全部屬性和值 print(soup.p['class'])#第一個p元素class屬性的值 print(soup.p['name'])#第一個p元素name屬性的值 print(soup.p.b.string)#第一個p標籤下的b標籤的文本內容 print(soup.p.contents)#第一個p元素下的全部子節點,不包括孫子節點 #第一個p元素全部的子節點 print(soup.p.descendants) for i,child in enumerate(soup.p.descendants): print(i,child) print(soup.p.parent)#第一個p元素的父節點 #第一個p元素全部的父節點 print(soup.p.parents) print(list(enumerate(soup.p.parents))) print(soup.p.next_sibling)#第一個p元素的下一個兄弟節點,注意有回車的時候要寫兩個next_sibling print(list(enumerate(soup.p.next_siblings)))#第一個p元素後面的全部兄弟節點 print(soup.p.previous_sibling)#第一個p元素的上一個兄弟節點 print(list(enumerate(soup.p.previous_siblings)))#第一個p元素前面的全部兄弟節點 ######################################################### #下面這些是比較經常使用的,上面的瞭解一下便可 # 判斷某個標籤是否有屬性,例如img標籤有一個alt屬性,有時候img沒有alt屬性,我就能夠判斷一下,不然出錯 if img.attrs.get('alt'): soup.find(id='text-7').find_all(name='li') #根據文本查找到該標籤 # 例以下面的,根據Description查找含有Description的第一個p元素 test = soup.find(lambda e: e.name == 'p' and 'Description' in e.text) # 其實若是是直接子元素的話,也可使用parent,可是這個不多用,適用狀況很少 test= soup.find(text=re.compile('Description')).parent #查找某個屬性爲包含的標籤 #標籤的屬性有不少值,例如img標籤的alt屬性,有item和img兩個值,能夠經過以下查找 noscript.find_all('img',attrs={'alt':re.compile('item')}) #判斷屬性裏面是否有某個值 if 'Datasheet' in img['alt']: #替換全部的br換行符號 html = get_one_page(url) return html.replace('<br>', '').replace('<br />', '').replace('<br/>', '') #去除最後一個逗號 datasheet_url.rstrip(',') #去除關鍵字和空格,只要後面的內容 #例如 Function : Sensitive Gate Silicon Controlled Rectifiers #獲得的就是Sensitive Gate Silicon Controlled Rectifiers return re.sub(keywords+'.*?[\s]:.*?[\s]', '', child.find(text=re.compile(keywords)).string) #返回某個符號以前的字符 import re text="K6X4008C1F-BF55 ( 32-SOP, 55ns, LL )" b=re.search('^[^\(]*(?=\()',text,re.M) if b: print(b.group(0)) print(len(b.group(0))) else: print('沒有') #關鍵地方是,這裏是匹配的( 括號須要\來轉義一下 ^[^\(]*(?=\() #若是是逗號,能夠寫 ^[^,]*(?=,) #若是是單詞,好比我想匹配Vae這個單詞,以下 text='XuSong Vae hahaha' text2='VV Vae hahaha' b=re.search('^[^Vae]*(?=Vae)',text,re.M) #這個例子很重要,text是能夠正則出XuSong的,可是下面的VV就正則不出來了,由於^是後面的Vae的任意一個單詞,只要前面包含就不行,VV包含了V,因此就不行了,我嘗試着給Vae加括號,也不行.而後我就想了一個辦法,把Vae替換成逗號之類的符號不就能夠了,只要是一個字符就行,以下 text='XuSong Vae hahaha' text2='VV Vae hahaha' b=re.search('^[^,]*(?=,)',text.replace('Vae',','),re.M) #一段HTML元素中去除a標籤,可是保留a標籤的值 return re.sub('(<\/?a.*?>)', '', description_element) #有時候想獲取一段HTML元素內容,由於有的排版在,好比ul和li元素,排版是在的,若是使用text就是一串文本,換行都沒了,能夠這樣 str(child.find(class_='ul2')) #獲取到這段HTML元素以後,使用str函數變成字符串便可 #下一個兄弟元素最好使用find_next_sibling() #等待驗證,和next_sibling比較一下再說 #Python爬蟲數據插入到MongoDB import pymongo client = pymongo.MongoClient("mongodb://admin:test123@192.168.3.80:27017/") db = client.datasheetcafe collection = db.datasheetcafe collection.insert_one(message)
pip install pyquery
在各大網站上,不少都有圖形驗證碼,這個時候可使用OCR來識別,OCR是光學字符識別,經過掃描字符翻譯成文本.tesserocr是一個OCR的識別庫
首先要安裝tesserocr的核心庫tesseract,必須下載,不然tesserocr安裝不成功
有趣和坑爹的是,有一款同名的遊戲,我Google的時候覺得是官網中招了 tesseract 同名遊戲
選擇一個windows版本下載安裝,過程當中能夠自行勾選是否添加多語言,注意,在線下多語言超級慢,安裝完成以後添加一下環境變量,有兩個
Path裏面添加 C:\Program Files\Tesseract-OCR
新建一個環境變量TESSDATA_PREFIX C:\Program Files\Tesseract-OCR\tessdata
tesserocr仍是經過pip安裝
pip install tesserocr pillow
若是安裝出現了一大堆紅色的,就換個方式,使用whl安裝
在tesserocr whl 裏面找到你對應的Python版本,下載,注意你的Python是32位是仍是64位的,下載whl以後執行
pip install C:\Users\Justin\Downloads\tesserocr-2.4.0-cp37-cp37m-win32.whl
至此,tesserocr驗證碼識別就安裝完成了
pip install flask
運行,而後終端會出現鏈接,ctrl+鼠標左鍵點擊就能夠看到瀏覽器中出現許嵩
from flask import Flask app=Flask(__name__) @app.route("/") def hello(): return "許嵩" if __name__=="__main__": app.run()
pip install tornado
這個終端不會輸出訪問地址了,本身在瀏覽器上輸入http://127.0.0.1:8888/
能看到Hello就表明成功了
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello") def make_app(): return tornado.web.Application([ (r"/",MainHandler) ]) if __name__=="__main__": app=make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
Python爬蟲不只能夠爬網頁,也能夠爬App的數據
APP的暫時不寫
我直接使用requests,Beautifulsoup已經爬取了幾萬條數據了,爬蟲的爬取量不大的話本身寫是ok的,可是你會發現,爬蟲的代碼好多都是重複的啊,僅僅是爬蟲的規則不同而已,因此,有了一點基礎以後就能夠開始上手框架了
這個框架我真的是無語了,都說很強大,如今是2019.7.25號,這個框架在GitHub4個月沒有更新了, 我使用的時候遇到一堆問題
一堆問題啊,真坑
pip install pyspider
上面的安裝pyspider會報錯,提示你安裝pycurl,我就奇怪了,不能整合到一塊兒嗎
去這個網址https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl
找到你對應的版本,好比個人Python是3.7.3 32bit 的就使用37,32位,以下
找到這個以後,下載,而後經過下載路徑進行pip安裝
pip install D:\pycurl-7.43.0.3-cp37-cp37m-win32.whl
Pycurl安裝完成以後再執行上面的pyspider安裝便可
這個Spider的做者,使用了async關鍵字,可是Python3.7版本也使用了這個async關鍵字.衝突了,並且這個做者如今不更新了........
手動替換一下async關鍵字吧,須要替換三個文件
在這三個文件夾內,記得把async關鍵字換成async_mod,隨意換,我是起的async_mod
替換的時候區分大小寫,由於裏面還有CurlAsyncHTTPClient這種,不要替換亂了
問題二的async關鍵字替換了以後仍是報錯,能夠嘗試下面的方法
經過pip list能夠查看WsgiDAV的版本,若是版本是3的話卸載
pip uninstall WsgiDAV
而後再按照2版本的
python -m pip install wsgidav==2.4.1
還有一個地方pyspider\webui下的webdav.py,修改209行
將'domaincontroller': NeedAuthController(app), 改成 'http_authenticator':{ 'HTTPAuthenticator':NeedAuthController(app), }
這三個問題都作了的話,應該就能夠啓動Spider了
輸入http://localhost:5000/便可看到Spider的頁面