python3網路爬蟲開發實戰(配置踩坑及學習備忘)

sandonz 發表於 2022-05-12
Python 爬蟲

一、開發環境配置

1.1,python安裝

Windows(設定環境變數)

Linux

Mac

1.2 請求庫的安裝

requests

Selenium

selenium==2.48.0下這個老版本,新版不支援phantomjs

ChromeDriver

淘寶映象站:http://npm.taobao.org/mirrors/chromedriver

GeckoDriver

PhantomJS(版本2.1.1)

安裝依賴:

sudo apt-get install build-essential chrpath libssl-dev libxft-dev
sudo apt-get install libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev

下載地址(淘寶映象):https://npmmirror.com/mirrors/phantomjs?spm=a2c6h.24755359.0.0.6d443dc1T0AXPt

安裝方式一:放到系統目錄(推薦)

原名太長,重新命名,移動到/usr/local/share目錄下

sudo mv phantomjs211 /usr/local/share/

建立啟動軟連結:

sudo ln -s /usr/local/share/phantomjs211/bin/phantomjs /usr/local/bin/

安裝方式二:放到使用者目錄

下載包解壓後解壓,資料夾移到home目錄下,
並設為隱藏檔案(資料夾名稱前加.號),
修改~/.profile檔案:

sudo vim ~/.profile

末尾新增phantomjs執行檔案路徑,如:
export PATH="$HOME/.phantomjs版本號/bin:$PATH"

錯誤解決

Auto configuration failed
140277513316288:error:25066067:DSO support routines:DLFCN_LOAD:could not load the shared library:dso_dlfcn.c:185:filename(libssl_conf.so): libssl_conf.so: 無法開啟共享物件檔案: 沒有那個檔案或目錄
140277513316288:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:
140277513316288:error:0E07506E:configuration file routines:MODULE_LOAD_DSO:error loading dso:conf_mod.c:285:module=ssl_conf, path=ssl_conf
140277513316288:error:0E076071:configuration file routines:MODULE_RUN:unknown module name:conf_mod.c:222:module=ssl_conf

解決方法:

export OPENSSL_CONF=/etc/ssl/

aiohttp

1.3解析庫的安裝

lxml

Beautiful Soup

pyquery

tesserocr(先安裝tesseract)

(在windows下因為相容問題,所以用pytesseract替代tesseroct,然後設定tesseract的環境變數。)

tesseract語言下載包:https://codechina.csdn.net/mirrors/tesseract-ocr/tessdata?utm_source=csdn_github_accelerator

測試安裝是否成功:

tesseract image.png result -l eng |type result.txt
tesseract image.png result -l eng |cat result.txt
import pytesseract
from PIL import Image

im=Image.open('image.png')
print(pytesseract.image_to_string(im))
import pytesseract
from PIL import Image

image = Image.open("./NormalImg.png")
text = pytesseract.image_to_string(image)
print(text)

1.4 資料庫的安裝

windows下修改儲存位置、日誌位置,設定環境變數。

MySQL安裝

(win10:計算機–管理–服務,開啟和關閉MySQL服務。)

net stop mysql

MongoDB安裝及使用

安裝gnupg軟體包

sudo apt-get install gnupg

匯入包管理系統使用的公鑰:

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

新增MongoDB儲存庫:(ubuntu20.04)

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

更新儲存庫:

sudo apt-get update

安裝mongodb:

sudo apt install mongodb-org

啟動mongodb,設定開機自啟動

sudo systemctl start mongod.service
sudo systemctl enable mongod

檢查MongoDB服務的狀態:

sudo systemctl status mongod

關閉MongoDB服務:

sudo systemctl stop mongod

重新啟動MongoDB服務:

sudo systemctl restart mongod

關閉開機啟動:

sudo systemctl disable mongod

進入MongoDB shell:

mongo

啟動錯誤

● mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2020-04-20 13:32:29 IST; 6min ago
Docs: https://docs.mongodb.org/manual
Process: 27917 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=14)
Main PID: 27917 (code=exited, status=14)

Apr 20 13:32:29 manojkumar systemd[1]: Started MongoDB Database Server.
Apr 20 13:32:29 manojkumar systemd[1]: mongod.service: Main process exited, code=exited, status=14/n/a
Apr 20 13:32:29 manojkumar systemd[1]: mongod.service: Failed with result ‘exit-code’.

解決辦法:

sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown mongodb:mongodb /tmp/mongodb-27017.sock
sudo service mongod restart

windows下:

配置檔案,bin目錄下有一個mongod.cfg的檔案,即為MongoDB的配置檔案。可利用記事本等工具開啟進行一些配置。 例如修改資料檔案儲存位置連線埠號等。
storage塊下dbpath為資料檔案存放目錄 ,
systemlog塊下path為日誌檔案儲存位置。
如果指定目錄或日誌不存在啟動失敗,可手動建立
如果進行修改想要時修改生效的話,需關閉服務並重新啟動。

Redis

windows免費版Redis-x64-3.2.100.msi

1.5 儲存庫的安裝

PyMySQL

PyMongo

redis-py

RedisDump

1.6 web庫的安裝

Flask

Tornado

1.7 App爬取相關庫的安裝

Charles

mitmproxy

7.*版本有依賴問題,換低版本(如5.0.0)

Appium

1.8 爬蟲框架的安裝

pyspider

執行命令pyspider all之前,先輸入:

export OPENSSL_CONF=/etc/ssl/

依賴解決

先安裝phantomjs

其他軟體要求版本

Wsgidav==2.3.0
Werkzeug==0.16.1
Flask==1.1.1(不行就試試0.1.0)

其他相關依賴一般互相有提示

語法錯誤解決

由於async和await從 python3.7 開始已經加入保留關鍵字中,所以修改/home/san/.local/lib/python3.9/site-packages/pyspider/下的python檔案的asyncshark(全部替換),在替換是要注意:只替換名為async 的變數引數名,不要圖省事選擇“全部替換”,導致引用的類名被修改,如下圖。
在這裡插入圖片描述

注意:例如檔案tornado_fetcher.py中如果全部替換是17處,便會報錯 from tornado.curl_httpclient import CurlAsyncHTTPClient
from tornado.simple_httpclient import SimpleAsyncHTTPClient

如果已經全部替換完,請回去手動將其中幾處引用名改回來。
要替換的檔案如下:
1.run.py
2.fetcher\tornado_fetcher.py
3.webui\app.py

Error: Could not create web server listening on port 25555

檢視25555埠占用:

lsof -i:25555

找到佔用程式PID,kill掉

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
phantomjs 8982  san    7u  IPv4 194586      0t0  TCP *:25555 (LISTEN)

kill 8982

重新執行

pyspider all

Scrapy

Scarpy-Splash

splash需要通過Docker安裝

Scrapy-Redis

1.9 部署相關庫的安裝

Docker

Scrapyd

Scrapyd-Client

Scrapyd API

Scrapyrt

Gerapy

二、爬蟲基礎

HTTP基本原理

URI和URL

URI統一資源標誌符
URL統一資源定位符
URL是URI的子集

超文字

HTTP和HTTPS

HTTP超文字傳輸協議,Hyper Text Transfer Protocol

HTTPS是HTTP的安全版,即HTTP下加入SSL層,Hyper Text Transfer Protocol over Secure Socket Layer

HTTP請求過程及響應

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

網頁基礎

網頁的組成

HTML
CSS
JavaScript

網頁的結構

節點樹及節點間的關係

在這裡插入圖片描述
在這裡插入圖片描述

選擇器

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

爬蟲的基本原理

爬蟲概述

1,獲取網頁(原始碼)
獲取庫urllib、requests

2,提取資訊
提取庫Beautiful Soup、pyquery、lxml

3,儲存資料
本地:TXT、JSON或MySQL、MongoDB
遠端伺服器:藉助SFTP操作

4,自動化程式

能抓怎樣的資料

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/a485d2592e924920a975dea04068b479.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc2FuZG9ueg==,size_20,color_FFFFFF,t_70,g_se,x_16

JavaScript 渲染頁面

在這裡插入圖片描述在這裡插入圖片描述

會話和Cookies

在這裡插入圖片描述

靜態網頁和動態網頁

在這裡插入圖片描述在這裡插入圖片描述

無狀態HTTP

在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

常見誤區

在這裡插入圖片描述

代理的基本原理

在這裡插入圖片描述

基本原理

在這裡插入圖片描述

代理的作用

在這裡插入圖片描述

爬蟲代理

在這裡插入圖片描述

代理分類

在這裡插入圖片描述在這裡插入圖片描述

常見代理設定

在這裡插入圖片描述

三、基本庫的使用

1,使用urllib

request:它是最基本的 HTTP 請求模組,可以用來模擬傳送請求。只需要給庫方法傳入 URL 以及額外的引數,就可以模擬實現這個過程了 。
error:異常處理模組,如果出現請求錯誤 , 我們可以捕獲這些異常,然後進行重試或其他操
作以保證程式不會意外終止 。
parse : 一個工具模組,提供了許多 URL 處理方法,比如拆分、解析 、 合併等 。
robot parser :主要是用來識別網站的 robots.txt 檔案,然後判斷哪些網站可以爬,哪些網站不
可以爬,它其實用得 比較少 。

傳送請求

urlopen()
API:
urllib.request.urlopen(url, data=None, [ timeout, ]*, cafile=None, capath=None, cadefault=False, context=None )

data引數

timeout引數

context引數

cafile引數
capath引數

Request
class urllib.request.Request ( url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

高階用法
urllib.request 模組裡的 BaseHandler 類,它是所有其他 Handler 的父類,它提
供了最基本的方法,例如 default_open()、 protocol_request ()等 。

各種Handler子類
HTTPDefaultErrorHandler :用於處理 HTTP 響應錯誤,錯誤都會丟擲 HTTP Error 型別的異常 。
HTTPRedirectHandler :用於處理重定向 。
HTTPCookieProcessor : 用於處理 Cookies 。
ProxyHandler :用於設定代理 , 預設代理為空 。
HTTPPasswordMgr :用於管理密碼,它維護了使用者名稱和密碼的表 。
HTTPBasicAuthHandler : 用於管理認證,如果一個連結開啟時需要認證,那麼可以用它來解
決認證問題。

處理異常

解析連結

分析Robots協議