2022年 11月 6日

python3网络爬虫开发实战(配置踩坑及学习备忘)

文章目录

  • 一、开发环境配置
    • 1.1,python安装
      • Windows(设置环境变量)
      • Linux
      • Mac
    • 1.2 请求库的安装
      • requests
      • Selenium
      • ChromeDriver
      • GeckoDriver
      • PhantomJS(版本2.1.1)
        • 安装方式一:放到系统目录(推荐)
        • 安装方式二:放到用户目录
        • 错误解决
      • aiohttp
    • 1.3解析库的安装
      • lxml
      • Beautiful Soup
      • pyquery
      • tesserocr(先安装tesseract)
    • 1.4 数据库的安装
      • MySQL安装
      • MongoDB安装及使用
        • 启动错误
        • windows下:
      • Redis
    • 1.5 存储库的安装
      • PyMySQL
      • PyMongo
      • redis-py
      • RedisDump
    • 1.6 web库的安装
      • Flask
      • Tornado
    • 1.7 App爬取相关库的安装
      • Charles
      • mitmproxy
      • Appium
    • 1.8 爬虫框架的安装
      • pyspider
        • 运行命令`pyspider all`之前,先输入:
        • 依赖解决
        • 语法错误解决
        • Error: Could not create web server listening on port 25555
      • Scrapy
      • Scarpy-Splash
      • Scrapy-Redis
    • 1.9 部署相关库的安装
      • Docker
      • Scrapyd
      • Scrapyd-Client
      • Scrapyd API
      • Scrapyrt
      • Gerapy
  • 二、爬虫基础
    • HTTP基本原理
      • URI和URL
      • 超文本
      • HTTP和HTTPS
      • HTTP请求过程及响应
    • 网页基础
      • 网页的组成
      • 网页的结构
      • 节点树及节点间的关系
      • 选择器
    • 爬虫的基本原理
      • 爬虫概述
      • 能抓怎样的数据
      • JavaScript 渲染页面
    • 会话和Cookies
      • 静态网页和动态网页
      • 无状态HTTP
      • 常见误区
    • 代理的基本原理
      • 基本原理
      • 代理的作用
      • 爬虫代理
      • 代理分类
      • 常见代理设置
  • 三、基本库的使用
    • 1,使用urllib
      • 发送请求
      • 处理异常
      • 解析链接
      • 分析Robots协议

一、开发环境配置

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
  • 1
  • 2

下载地址(淘宝镜像):https://npmmirror.com/mirrors/phantomjs?spm=a2c6h.24755359.0.0.6d443dc1T0AXPt

安装方式一:放到系统目录(推荐)

原名太长,重命名,移动到/usr/local/share目录下

sudo mv phantomjs211 /usr/local/share/
  • 1

创建启动软链接:

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

安装方式二:放到用户目录

下载包解压后解压,文件夹移到home目录下,
并设为隐藏文件(文件夹名称前加.号),
修改~/.profile文件:

sudo vim ~/.profile
  • 1

末尾添加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/
  • 1

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
  • 1
tesseract image.png result -l eng |cat result.txt
  • 1
import pytesseract
from PIL import Image

im=Image.open('image.png')
print(pytesseract.image_to_string(im))
  • 1
  • 2
  • 3
  • 4
  • 5
import pytesseract
from PIL import Image

image = Image.open("./NormalImg.png")
text = pytesseract.image_to_string(image)
print(text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1.4 数据库的安装

windows下修改存储位置、日志位置,设置环境变量。

MySQL安装

(win10:计算机–管理–服务,开启和关闭MySQL服务。)

net stop mysql
  • 1

MongoDB安装及使用

安装gnupg软件包

sudo apt-get install gnupg
  • 1

导入包管理系统使用的公钥:

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

添加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
  • 1

更新存储库:

sudo apt-get update
  • 1

安装mongodb:

sudo apt install mongodb-org
  • 1

启动mongodb,设置开机自启动

sudo systemctl start mongod.service
sudo systemctl enable mongod
  • 1
  • 2

检查MongoDB服务的状态:

sudo systemctl status mongod
  • 1

关闭MongoDB服务:

sudo systemctl stop mongod
  • 1

重新启动MongoDB服务:

sudo systemctl restart mongod
  • 1

关闭开机启动:

sudo systemctl disable mongod
  • 1

进入MongoDB shell:

mongo
  • 1

启动错误

● 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
  • 1
  • 2
  • 3

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/
  • 1

依赖解决

先安装phantomjs

其他软件要求版本

Wsgidav==2.3.0
Werkzeug==0.16.1
Flask==1.1.1(不行就试试0.1.0)
  • 1
  • 2
  • 3

其他相关依赖一般互相有提示

语法错误解决

由于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
  • 1

找到占用进程PID,kill掉

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

  • 1
  • 2
  • 3
kill 8982
  • 1

重新运行

pyspider all
  • 1

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协议