Loading

Selenium爬虫使用总结

Selenium【Version: 4.9.1】爬虫使用中阶攻略,包含一些其他博客可能没有的经验

一共涉及三个模块:Selenium控件控制OCR识别pyinstaller打包+ini配置

from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import cv2
import ddddocr
import matplotlib.pyplot as plt
import time, sys, os, re
from configparser import ConfigParser

1 谷歌浏览器加载网页

# 1.1.1 可以在开始加入一些浏览器设置
options = webdriver.ChromeOptions()
# 处理SSL证书错误问题
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
# 忽略无用的日志
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
# 1.1.2 将谷歌浏览器实例化成对象
driver = webdriver.Chrome(chrome_options=options)
# 给浏览器固定一些参数
driver.implicitly_wait(10)   # 隐式等待。网页加载数据需要时间,智能化等待。
driver.set_window_size(1600,900)  # 固定窗口,最好有,有一些无法定位控件可以考虑位置虚拟点击
driver.get('http://...')   # 要爬取的网页

2 验证码获取自动填写登陆

这段操作需要借助F12,找到验证码位置,一种方案是验证码直接js获取,个人认为比较麻烦;我选择的是直接定位验证码位置,截取+OCR识别

# 屏幕截图保存下整张图片
driver.get_screenshot_as_file("./temp/screenshot.png")
# 读取图片
img = cv2.imread("./temp/screenshot.png")
# 定位到的位置 左上角x0,y0;右下角x1,y1
# 这里借助plt.imshow,很容易定位
x0,y0 = 887,525
x1,y1 = 965,562
cropped = img[y0:y1, x0:x1] # 裁剪坐标为[y0:y1, x0:x1]
# 保存下验证码图片
cv2.imwrite("./temp/checkcode.png", cropped)
# 实例化OCR包,此包免费且识别率已经很高了
ocr = ddddocr.DdddOcr()
with open("./temp/checkcode.png", 'rb') as f:
    image = f.read()
    checkcode = ocr.classification(image)
print("验证码OCR检测结果: {}".format(str(checkcode)))

## 2 模拟登陆
# 2.1 个人经验控件查找使用ID或者XPath,不要使用Class
# if 控件比较少 像登陆界面 而且控件属性有ID,使用ID查询
# if 控件多,一般是要爬取数据的界面,多选择XPath。
# 2.2 还有一个注意点,往控件填数据,精尽量不要用一行的写法,而是对控件分配变量名,
# 再对变量名赋值,否则有时候导致以后driver找控件找不到。
name = driver.find_element(By.ID, "userName")
name.send_keys('name')
pwd = driver.find_element(By.ID, "password")
pwd.send_keys('passwd')
code = driver.find_element(By.ID, "inputCode")
code.send_keys(str(checkcode))
# .click() 左键点击【虚拟的 不会占用你的鼠标使用权】
driver.find_element(By.ID, "sduept-submit").click()
print("登陆成功.")

3 点击控件进入新界面

# 这里采用一行写法,因为需要进入类似子网页,driver需要刷新
driver.find_element(By.XPATH, '//*[@id="Menu1"]....').click()

4 对某个控件下子控件循环

# 这里应该你可以总结到一些规律
driver_boy = driver.find_element(By.ID, "cc")
while True:
    select_page = driver_boy.find_element(By.CLASS_NAME, "pagination-num")
    select_page.clear()
    select_page.send_keys(now_page)
    select_page.send_keys("python", Keys.ENTER)
    driver_boy.find_element...
    ...

5 ini参数读取

# filename: config.ini
[settings]
now_mode = 3
# 是否下载对应压缩包 1即为下载
isdownzip = 1
# 是否下载对应偏移数据 1即为下载
isdowndev = 1

[page]
# if -1 从开始下载
open_page = 1
# if -1 一直下载
end_page = 9999
# 从第几个开始下
page_i = 11
# 与你电脑设置的每页数量一致即可,并非对网页自动修改
page_sum = 50

[time]
open_time = 2017-08-01 00:00:00
end_time = 2018-12-31 23:59:59
config = ConfigParser()  # 需要实例化一个ConfigParser对象
config.read('config.ini',encoding='utf-8')  # 读取ini
config = config._sections # config转成成dict格式

now_mode = int(config['settings']['now_mode'])
isdownzip = int(config['settings']['isdownzip'])  # 是否下载对应压缩包
isdowndev = int(config['settings']['isdowndev'])  # 是否下载对应偏移数据(勿动)

open_page = int(config['page']['open_page'])  # if -1 从开始下载
end_page = int(config['page']['end_page'])   # if -1 一直下载
page_i = int(config['page']['page_i'])     # 从第几个开始下
page_sum = int(config['page']['page_sum'])  # you computer' sum/page

open_time = config['time']['open_time']
end_time = config['time']['end_time']

6 其他

  1. 如果下载过多导致网速变慢,脚本加载也变慢,自行加一些time.sleep(3)睡眠即可
  2. 如果是单文件py打包请使用(temp是静态文件存放总路径)
pyinstaller --add-data temp;temp -p . xxx.py

​ 如果使用了ddddocr不建议打包成单exe,因为ddddocr不会自动加入

​ 如果就想要小的文件,不想导出后很大,这里提供建议,环境的包目录找到ddddocr放到temp下,修改代码 的ddddocr,加一层temp,相对路径读取

  1. pyinstaller打包程序对比py直接运行有一定区别,py直接运行在浏览器靠上位置有selenium控制提示,打包之后没有了,凡是需要定位的坐标需要下移30像素【如果你也是1600*900的前提下】
posted @ 2024-09-19 14:21  绯色鱼  阅读(99)  评论(0)    收藏  举报