【爬虫开发】基于项目实战,从开发到部署经验总结

举报
liuming9157 发表于 2023/04/27 18:42:18 2023/04/27
【摘要】 本文介绍了爬虫的常见开发方法,包括使用selenium IDE获取自动化脚本、postman分析接口、scrapy开发爬虫,到购买代理等全方位的爬虫开发技巧。

开发过程

1.通过IDE开发

Chrome 插件

科学上网,然后到插件商店,搜索selenium IDE安装。

Firefox插件

没有科学上网条件的使用firefox插件,同样搜索selenium IDE安装。

开发

安装好后,打开插件,录制下自己的浏览器操作。录制过程中,可以删去一些没有意义的操作,这样可以让导出脚本时更加简洁。
通过上一步录制完成后,导出录制脚本,语言选择python.即可得到完整的python脚本代码。
selenium IDE导出的python已经可以直接使用了,也可以进一步精简,比如去除pytest依赖。
到后期会发现,如果是多个爬虫同时运行,chrome运行起来特别耗内存。所以考虑抛开selenium和浏览器,直接访问目标网站api.

2.通过postman开发

postman开发是api开发的精华。待后续补充

3. scrapy开发

待补充

4. 添加代理

代理购买网站

大量流量访问目标网站会造成ip封禁,临时解决方案是等待几分钟后再访问。永久解决方案是使用代理ip。
SmartProxy
价格高,但确实好用

部署过程

部署环境是CentOS

1.宝塔部署

宝塔环境下python的使用

centOS自带python 2.7,但是我们的开发是基于python3的。centOS安装宝塔后,使用如下命令
btpython -V
会发现btpython就是python 3.8,所以不需要再安装pyenv等python版本管理器了。

在centOS上安装Chrome

  1. 修改yum源
    在/etc/yum.repos.d/目录下新建文件google-chrome.repo,向其中添加如下内容
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
  1. yum安装
    yum -y install google-chrome-stable
    Google官方源可能在中国无法使用,导致安装失败或者在国内无法更新,可以添加以下参数来安装: 
    yum -y install google-chrome-stable --nogpgcheck
  2. 检查chrome版本,安装对应chromedriver
    google-chrome -v

在centOS上安装火狐浏览器

可以直接使用yum安装
yum install firefox

安装Webdriver

  1. ChromeDriver
    淘宝镜像
    官方链接
  2. GeckoDriver适用于火狐浏览器
    Github链接
    Geckodriver与Firefox版本映射表
  3. SafariDriver(适用于mac开发)
    Safari已自带webriver,无需单独安装但需要开启。菜单/开发/允许远程调试。menu/develop/Allow remote automation
    所有webriver放置于/usr/local/bin文件夹下

设置无头浏览器

开发时不会使用无头浏览器,但是部署到服务器后建议使用无头模式。无头模式的示例代码如下

from selenium import webdriver

options = webdriver.ChromeOptions()   
# options = webdriver.FirefoxOptions()  
options.add_argument("--headless")   
options.add_argument("--no-sandbox")   
driver = webdriver.Chrome(options=options)   
driver.get("https://www.qq.com")   
driver.get_screenshot_as_file("test.png")   
driver.quit()

2. supervisor监控

之所以使用supervisor监控,是因为爬虫总会因为各种原因导致进程意外退出,使用supervisor可以在进程退出时自动重启。

supervisor安装

  1. 宝塔下的supervisor安装
    建议使用宝塔的supervisor插件,傻瓜式安装
  2. 非宝塔下的supervisor安装
    pip install supervisor
  3. macOS下的supervisor安装
    brew install supervisor
    mac 安装supervisor后,可以启动浏览器输入
    http://localhost:9001
    即可可视化管理supervisor项目

supervisor的命令行启动

宝塔可视化使用supervisor很方便,但是当监控进程达到二位数以上时,每个进程手动一个个启动很费时间。所以建议使用命令行启动和暂停。
supervisor的命令行命令如下

supervisorctl reload
supervisorctl stop all

宝塔下supervisor的安装路径是/www/server/panel/pyenv/bin/supervisorctl
因此以上命令应当修改为

# 查看版本
/www/server/panel/pyenv/bin/supervisord -v  
# 重新启动
/www/server/panel/pyenv/bin/supervisorctl reload
# 停止所有进程
/www/server/panel/pyenv/bin/supervisorctl stop all

supervisor event listener监控报警

程序部署后,我们总想知道运行的怎么样,比如:程序异常退出次数多不多,爬虫是不是启动失败等等。使用supervisor event listener可以起到监控报警作用。
supervisor的event listener也是supervisor一个子进程。因此,需要先写一个listener.py监控脚本,然后让supervisor运行该脚本即可。
listener.py的书写方法以后再专门写一篇文章。
写完后,找到supervisor主配置文件,并添加以下内容

[eventlistener:listener]
command=btpython listener.py   
process_name=%(program_name)s 
numprocs=1                    
events=PROCESS_STATE                  
directory=/www/wwwroot/project 
autostart=true               
autorestart=unexpected  
user=root      

宝塔环境下使用supervisor

  1. 安装python项目管理器,安装python3.7.8版本,设置为默认版本
    pyenv global 3.7.8

常见问题

  1. 宝塔下supervisor无法正常启动?
    去/www/server/panel/plugin/supervisor/log中查看错误日志
  2. 明明安装了pytest但是却显示no named module pytest?
    这是因为服务器中有多个python版本,pytest的安装目录不在默认版本下,解决方法如下:
    使用which pytest找到pytest的命令所在处,然后/root/.pyenv/shims/python3 -m pytest
  3. 远程服务器重装系统后sshkey已变更怎么办?
    在本地执行ssh-keygen -R “ip”,其中ip地址更换成远程服务器地址
  4. linux如何查看进程
    https://www.linuxprobe.com/linux-look-process.html

定制宝塔

定制宝塔完全是因为开发期间很多重复性调试和安装工作让人头疼,于是分析了宝塔源代码,并根据自己需要进行了定制修改。估计很多同学应该不需要这一步了,我就不写教程了。如果有需要可以私信联系我。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。