Python爬蟲筆記安裝篇

爬蟲三步

  1. 抓取頁面:使用請求庫
  2. 分析頁面:使用解析庫
  3. 存儲數據:使用數據庫

因此,根據這三步,咱們要下載一些第三方庫,也就是請求庫,解析庫,數據庫.html

常常聽有人說:人生苦短,我用Pythonpython

我想這大概是由於Python有衆多的第三方庫,別人已經寫好了,你調用就完事了git

下面是爬蟲所須要的一些第三方庫的安裝,大部分可使用pip安裝,少數須要去官網下載github

pip是什麼?超級爽的包管理工具,能夠理解爲手機上的應用商店web

請求庫

Requests:阻塞式請求庫

Requests是什麼

Requests是一個請求庫,阻塞式的.意思就是你在請求瀏覽器的時候,只能等,期間什麼都作不了,效率很低很低的mongodb

Requests安裝

pip install Requests #Request庫安裝

selenium:瀏覽器自動化測試

selenium安裝

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

PhantomJS:隱藏瀏覽器窗口

PhantomJS是什麼

上面說到,最新版的Chrome瀏覽器支持隱藏窗口,其實使用PhantomJS也能夠實現隱藏窗口.Selenium是支持PhantomJS的,支持不一樣的瀏覽器,很方便

PhantomJS安裝

PhantomJS竟然不支持pip安裝,真是詫異,那就在官網下載吧.下載完成以後打開bin文件夾,有一個phantomjs.exe,仍是個小白布精靈圖標好可愛~和ChromeDriver同樣,把這個exe放到Python的Scripts目錄便可

檢測安裝很簡單,直接在終端打PhantomJS便可,若是進去了就ok,ctrl+d退出

PhantomJS使用

from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get('https://www.baidu.com')
print (browser.current_url)

aiohttp:異步請求庫

aiohttp是什麼

異步請求庫,和Requests恰好相反,在請求的時候,在瀏覽器還沒搭理你的時候,能夠乾點其餘的事.在爬蟲後期的代理中,用處很是大

aiohttp安裝

pip install aiohttp
#aiohttp官方推薦再下載兩個相關庫,不下也沒事
#cchardet是字符編碼檢測庫,aiodns是加速DNS解析庫
pip install cchardet aiodns

解析庫

安裝完上面的請求庫以後,咱們能夠獲取大量的網頁數據了,可是怎麼提取咱們想要的數據呢?這就要使用解析庫了,很是強大

lxml:解析HTML和XML,支持XPath

lxml是什麼

解析HTML和XML的一個解析庫,支持XPath解析方式

lxml安裝

pip install lxml

BeautifulSoup:解析HTML和XML

BeautifulSoup是什麼

解析HTML和XML的一個解析庫,具備強大的API和多樣的解析樣式

BeautifulSoup安裝

pip install bs4

BeautifulSoup驗證安裝

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>Hello</p>','lxml')
print (soup.p.string)

輸出hello代表安裝成功

BeautifulSoup基本用法

==我有一個重要的提醒,在獲取文本信息的時候,不要使用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)

pyquery:解析HTML,支持CSS選擇器

pyquery安裝

pip install pyquery

tesserocr:識別圖形驗證碼

tesserocr是什麼

在各大網站上,不少都有圖形驗證碼,這個時候可使用OCR來識別,OCR是光學字符識別,經過掃描字符翻譯成文本.tesserocr是一個OCR的識別庫

tesserocr安裝

首先要安裝tesserocr的核心庫tesseract,必須下載,不然tesserocr安裝不成功

tesseract Github下載地址

有趣和坑爹的是,有一款同名的遊戲,我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驗證碼識別就安裝完成了

Web庫

Flask:輕量級的Web服務程序

Flask安裝

pip install flask

Flask驗證安裝

運行,而後終端會出現鏈接,ctrl+鼠標左鍵點擊就能夠看到瀏覽器中出現許嵩

from flask import Flask
app=Flask(__name__)
@app.route("/")
def hello():
    return "許嵩"

if __name__=="__main__":
    app.run()

Tornado:支持異步的Web框架,支持成千上萬的鏈接

Tornado安裝

pip install tornado

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()

App庫

Python爬蟲不只能夠爬網頁,也能夠爬App的數據

Charles:網絡抓包工具,移動端支持也很好

APP的暫時不寫

爬蟲框架

我直接使用requests,Beautifulsoup已經爬取了幾萬條數據了,爬蟲的爬取量不大的話本身寫是ok的,可是你會發現,爬蟲的代碼好多都是重複的啊,僅僅是爬蟲的規則不同而已,因此,有了一點基礎以後就能夠開始上手框架了

pyspider框架:中國人寫的框架

這個框架我真的是無語了,都說很強大,如今是2019.7.25號,這個框架在GitHub4個月沒有更新了, 我使用的時候遇到一堆問題

一堆問題啊,真坑

pyspider安裝

pip install pyspider

問題一:須要先安裝Pycurl

上面的安裝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安裝便可

問題二:Python3.7版本的async關鍵字

這個Spider的做者,使用了async關鍵字,可是Python3.7版本也使用了這個async關鍵字.衝突了,並且這個做者如今不更新了........

手動替換一下async關鍵字吧,須要替換三個文件

  • run.py(在pyspider安裝目錄下)
  • tornado_fetcher.py(在pyspider\fetcher目錄下)
  • app.py(在pyspider\webui目錄下)

在這三個文件夾內,記得把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的頁面

相關文章
相關標籤/搜索