selenium自动登入爬取中国气象数据网

记录主要遇到的难点与好的参考文献

url = ‘http://data.cma.cn’

难点:
(1)验证码采用pytesseract库识别,正确率太低,如何提升
(2)验证码输入错误时,弹出alert,如何对状态进行判定,从而结束循环
(3)cookie登入
(4)需要点击js,所以选择selenium

全部用到的库

import sys
import time
import json
from selenium import webdriver
from PIL import Image
import pytesseract
import re
from selenium.common.exceptions import NoAlertPresentException
import csv

pytesseract识别验证码

1.tesseract需要添加环境变量,不想添加的话可以直接

pytesseract.pytesseract.tesseract_cmd = 'c://Program Files (x86)//Tesseract-OCR//tesseract'
testdata_dir_config = '--tessdata-dir "C://Program Files (x86)/Tesseract-OCR/tessdata"'

2,识别前对图像进行,二值化,去噪等处理

3.自己进行训练方法——tesseract-ocr

tesseract-ocr使用以及训练方法

4.识别验证码部分整个代码

#识别验证码
class img_code(object):
    def __init__(self,browser):
        self.brow``ser = browser

    def run(self):
        self.get_img(self.browser)
        image = Image.open('code.png')
        img = image.convert("L")  # 转灰度
        out = self.processing_image(img, 69)
        out = self.cut_noise(out)
        pytesseract.pytesseract.tesseract_cmd = 'c://Program Files (x86)//Tesseract-OCR//tesseract'
        testdata_dir_config = '--tessdata-dir "C://Program Files (x86)/Tesseract-OCR/tessdata"'
        code0 = pytesseract.image_to_string(out, lang='font', config=testdata_dir_config)
        code = ''.join(re.findall('\w+', code0))
        self.code = code
        return  code


    def get_img(self,browser):
        img_code = browser.find_element_by_xpath('//*[@id="yw0"]')
        img_code.screenshot('code.png')

    def processing_image(self,image, threshold):

        pixdata = image.load()
        w, h = image.size
        #         threshold = 160  # 该阈值不适合所有验证码,具体阈值请根据验证码情况设置
        # 遍历所有像素,大于阈值的为黑色
        for y in range(h):
            for x in range(w):
                if pixdata[x, y] < threshold:
                    pixdata[x, y] = 0
                else:
                    pixdata[x, y] = 255
        return image

    def cut_noise(self,image):

        rows, cols = image.size  # 图片的宽度和高度
        change_pos = []  # 记录噪声点位置

        # 遍历图片中的每个点,除掉边缘
        for i in range(1, rows - 1):
            for j in range(1, cols - 1):
                # pixel_set用来记录该店附近的黑色像素的数量
                pixel_set = []
                # 取该点的邻域为以该点为中心的九宫格
                for m in range(i - 1, i + 2):
                    for n in range(j - 1, j + 2):
                        if image.getpixel((m, n)) != 1:  # 1为白色,0位黑色
                            pixel_set.append(image.getpixel((m, n)))

                # 如果该位置的九宫内的黑色数量小于等于4,则判断为噪声
                if len(pixel_set) <= 4:
                    change_pos.append((i, j))

        # 对相应位置进行像素修改,将噪声处的像素置为1(白色)
        for pos in change_pos:
            image.putpixel(pos, 1)

        return image  # 返回修改后的图片

弹窗状态的判定

遇到了两种,一种是登录时就在本页面上弹窗,另一种是点开新页面出现弹窗且页面处于正在加载的状态

第一种弹窗

以是否出现错误来判断是否出现弹窗。

    def alert_is_present(self,browser):
        """Returns whether an alert is present"""
        try:
            browser.switch_to.alert
            return True
        except NoAlertPresentException:
            return False

第二种弹窗

思考了很久,怎么都不行。最后发现切换窗口可以自动关闭。。

try:
    browser.switch_to.window(browser.window_handles[0])
    browser
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用 Selenium 自动爬取淘宝商品详情数据可以分为以下步骤: 1. 安装 Selenium 和浏览器驱动:SeleniumPython 中用于自动化 Web 浏览器的库,需要安装;同时需要下载对应浏览器的驱动程序,如 ChromeDriver。 2. 打开浏览器并访问淘宝站:使用 Selenium 打开指定的浏览器并访问淘宝站。 3. 搜索关键字并获取搜索结果:在搜索框中输入关键字并点击搜索按钮,等待搜索结果加载出来,使用 Selenium 获取搜索结果页面的 HTML 代码。 4. 解析搜索结果页面:使用 BeautifulSoup 解析搜索结果页面,获取每个商品的链接。 5. 进入商品详情页面并获取数据:遍历每个商品的链接,使用 Selenium 进入商品详情页面并获取需要的数据,如商品标题、价格、评论数、销量等。 6. 存储数据:将获取到的数据存储到数据库或文件中。 下面是一个示例代码: ```python from selenium import webdriver from bs4 import BeautifulSoup import time # 设置浏览器驱动路径 driver_path = './chromedriver.exe' # 创建浏览器对象 browser = webdriver.Chrome(driver_path) # 设置搜索关键字 keyword = '手机' # 访问淘宝站 browser.get('https://www.taobao.com/') # 等待页面加载完成 time.sleep(3) # 找到搜索框并输入关键字 browser.find_element_by_name('q').send_keys(keyword) # 点击搜索按钮 browser.find_element_by_class_name('btn-search').click() # 等待搜索结果加载完成 time.sleep(5) # 获取搜索结果页面的 HTML 代码 html = browser.page_source # 使用 BeautifulSoup 解析搜索结果页面 soup = BeautifulSoup(html, 'html.parser') # 获取所有商品的链接 links = [] for item in soup.find_all('a', class_='J_ClickStat'): link = item.get('href') if link.startswith('https://'): links.append(link) # 遍历每个商品的链接并获取数据 for link in links: # 进入商品详情页面 browser.get(link) # 等待页面加载完成 time.sleep(3) # 获取商品标题 title = browser.find_element_by_xpath('//h3[@class="tb-main-title"]/text()') # 获取商品价格 price = browser.find_element_by_xpath('//div[@class="tb-property-cont"]/div[@class="tb-detail-price"]/span[@class="tb-price"]/text()') # 获取商品评论数 comment_count = browser.find_element_by_xpath('//div[@class="tb-rate-counter"]/span[@class="tm-count"]/text()') # 获取商品销量 sales_volume = browser.find_element_by_xpath('//div[@class="tb-sales-counter"]/span[@class="tm-count"]/text()') # 打印商品信息 print('标题:', title) print('价格:', price) print('评论数:', comment_count) print('销量:', sales_volume) # 关闭浏览器 browser.quit() ``` 需要注意的是,使用自动爬取数据容易被站识别为机器行为,可以添加一些随机等待时间、请求头伪装等方式来降低被识别的概率。同时,爬取数据时也需要遵守站的爬虫规则,如不过度频繁访问、不采集敏感信息等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值