爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板)

  • Hi, I’m @货又星
  • I’m interested in …
  • I’m currently learning …
  • ️ I’m looking to collaborate on …
  • How to reach me …
    • README 目录(持续更新中) 各种错误处理、爬虫实战及模板、百度智能云人脸识别、计算机视觉深度学习CNN图像识别与分类、PaddlePaddle自然语言处理知识图谱、GitHub、运维…
    • WeChat:1297767084
    • GitHub:https://github.com/cxlhyx

文章目录

  • 概要
  • 解决动态刷新
  • 基于selenium框架的爬虫
  • 解决登录以及验证吗问题
  • 源码
    • 爬虫模板
    • 基于selenium框架的爬虫模板,包含登录与验证码问题
    • 爬虫项目实战:爬虫模板爬取单位净值 (动态更新网址)

概要

Python 网络爬虫的常用库汇总
python爬虫之Beautifulsoup模块用法详解

爬虫
本文主要介绍了爬虫的相关知识,包括如何解决动态刷新、基于selenium框架的爬虫、解决登录以及验证等问题。其中,对于动态刷新问题的解决方法,我们可以使用定时器或者代理IP等方式;对于基于selenium框架的爬虫,我们需要了解该框架的基本原理和使用方法,并通过实例演示如何使用selenium实现爬虫;在解决登录和验证问题时,我们可以通过模拟登录、验证码识别等方式来解决这些问题。通过本文的学习,读者可以进一步提升自己的爬虫技能,更好地应对各种复杂的爬取情况。

解决动态刷新

新闻网页、基金网页常用
动态刷新通常指的是一种网页更新机制。在网页中,动态刷新能够实时或者定期地更新数据,以便为用户提供最新的信息。这种技术的实现主要依赖于JavaScript、Ajax等技术,可以局部刷新页面,减少对服务器的负载,并提高用户体验。在爬虫领域,遇到动态刷新的网页会增大爬取的难度,因此需要了解和掌握相应的应对策略。

比如我们想爬取某个基金的单位净值和历史净值,由于它是动态刷新的,所以直接爬取是爬不到这一部分的源码的。爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板)_第1张图片
这时候该怎么办呢,我们可以F12打开开发人员工具,点击网络,一般想要的数据都保存在json文件中,json文件有点类似于字典,找到这个文件,直接爬取这个文件就可以了。注意json文件与字典用法不太一样,参考python标准库模块——json库的用法。
爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板)_第2张图片
爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板)_第3张图片
打开后是这样的
在这里插入图片描述
爬取源码发在最后。

基于selenium框架的爬虫

selenium框架也可以解决以上这个问题,其实这种问题通俗来讲就是F12开发人员工具看得到html源码但爬虫却爬取不到。
那么如何用selenium框架解决这种问题呢?
可以参考selenium用法详解【从入门到实战】【Python爬虫】【4万字】,这篇文章写得很好,能帮助我们快速入门,但由于版本问题,其中的页面元素定位,可能会有所变动。
原文使用的是

driver.find_element_by_id("toolbar-search-input")
driver.find_element_by_name("keywords")
# 即driver.find_element_by_标签(value)

但由于版本问题,可能需要变为

from selenium.webdriver.common.by import By  # 导入库函数,标签定位
driver.find_element(By.ID, "toolbar-search-input")
driver.find_element(By.NAME,'keywords')
# 即driver.find_element(By.标签, value)
# 标签名记得大写

解决登录以及验证吗问题

使用selenium框架比起request库的不便之处可能就在于部分网站的登录以及验证吗问题

对于登陆问题:其实很好解决,只需要利用selenium的标签定位,定位到输入框,在使用键盘控制输入信息,最后使用鼠标控制点击登录,就可以了。标签定位,键盘控制,鼠标控制在上面那篇文章也阐述的很清楚了,这里就不再赘述了。

# 登录
def login():
    try:
        driver.find_element(By.ID, 'username').send_keys('username')
        driver.find_element(By.ID, 'showPassword').send_keys('password')
        driver.find_element(By.ID, 'loginsubmit').click()
    except:
        pass

对于验证码问题:这里我们首先需要定位验证码图片,然后将其编码为base64字符串格式,接着使用OCR技术识别验证码,接着利用标签定位输入框,再使用键盘控制输入验证码,鼠标控制点击确认就可以了。
这里的重点在于OCR技术识别验证码,推荐使用第三方库ddddocr,名字很好记,带带弟弟ocr哈哈。这个库的下载还蛮简单的,可以直接使用pip install ddddocr,更多相关内容可以参考Python 通用验证码识别OCR库:ddddocr。

# 验证码
def captcha():
    try:
        image=driver.find_element(By.ID,'captchaImg')
        data=image.screenshot_as_base64
        ocr = ddddocr.DdddOcr()  # 解决验证码问题,利用ddddocr库的Ddddocr类
        text=ocr.classification(data)
        driver.find_element(By.ID,'captcha').send_keys(text)
        driver.find_element(By.ID,'validBtn').click()
    except:
        pass

源码

爬虫模板

这里主要参考了万能的Python爬虫模板来了,但在它的基础上稍微改进了一下,使用fake_useragent随机获取请求头,并把函数封装成类,方便使用。

import requests  # request库爬取源码
from bs4 import BeautifulSoup  # 解析源码
from fake_useragent import UserAgent  # 随机获取请求头

class MySpider():
    def __init__(self):
        pass

    # Step 1: 访问网页并获取响应内容
    def get_html_content(self,url):
        headers = {
            'User-Agent': UserAgent().random
        } # 请求头,爬虫程序通过加上请求头伪装成浏览器
        data={'name':'name'}
        try:
            response = requests.get(url, data=data, headers=headers)
            response.raise_for_status()  # 判断返回的Response类型状态是不是200
            response.encoding = response.apparent_encoding  # 从内容中分析出的响应内容编码
            html_content = response.text # 网页内容
            return html_content # 返回网页内容
        except Exception as e:
            print(f"网页请求异常:{e}")
            return None

    # Step 2: 解析网页并提取目标数据
    def parse_html(self,html_content):
        soup = BeautifulSoup(html_content, 'html.parser')  # 解析 html 数据
        # TODO:根据需求编写解析代码,并将结果保存到合适的数据结构中
        data_list = []
        return data_list

    # Step 3: 存储数据到本地或其他持久化存储服务器中
    def store_data(self,result_list):
        # TODO:编写存储代码,将数据结果保存到本地或其他服务器中
        pass

# Step 4: 控制流程,调用上述函数完成数据抓取任务
if __name__ == '__main__':
    spider=MySpider()
    target_url = "http://www.example.com"
    html_content = spider.get_html_content(target_url)
    if html_content:
        result_list = spider.parse_html(html_content)
        spider.store_data(result_list)
    else:
        print("网页访问失败")

基于selenium框架的爬虫模板,包含登录与验证码问题

from selenium import webdriver  # 打开网页爬取源码
from bs4 import BeautifulSoup  # 解析源码
from selenium.webdriver.common.by import By  # 标签定位
import ddddocr  # 验证码识别

class MySpider():
    def __init__(self):
        pass

    # 登录
    def login(self):  # 标签值需要修改
        try:
            driver.find_element(By.ID, 'username').send_keys('username')
            driver.find_element(By.ID, 'showPassword').send_keys('password')
            driver.find_element(By.ID, 'loginsubmit').click()
        except:
            pass

    # 验证码
    def captcha(self):  # 标签值需要修改
        try:
            image = driver.find_element(By.ID, 'captchaImg')
            data = image.screenshot_as_base64
            text = ocr.classification(data)
            driver.find_element(By.ID, 'captcha').send_keys(text)
            driver.find_element(By.ID, 'validBtn').click()
        except:
            pass

    # Step 1: 访问网页并获取响应内容
    def get_html_content(self,url):
        try:
            driver.get(url)
            driver.set_page_load_timeout(10)  # 设置超时限制10s
            self.login()
            self.captcha()
            html_content = driver.page_source  # 网页内容
            return html_content # 返回网页内容
        except Exception as e:
            print(f"网页请求异常:{e}")
            return None

    # Step 2: 解析网页并提取目标数据
    def parse_html(self,html_content):
        soup = BeautifulSoup(html_content, 'html.parser')  # 解析 html 数据
        # TODO:根据需求编写解析代码,并将结果保存到合适的数据结构中
        data_list = []
        return data_list

    # Step 3: 存储数据到本地或其他持久化存储服务器中
    def store_data(self,result_list):
        # TODO:编写存储代码,将数据结果保存到本地或其他服务器中
        pass

# Step 4: 控制流程,调用上述函数完成数据抓取任务
if __name__ == '__main__':
    driver = webdriver.Firefox()  # 打开火狐浏览器
    ocr = ddddocr.DdddOcr()  # 解决验证码问题,利用ddddocr库的Ddddocr类
    spider=MySpider()
    target_url = "http://www.example.com"
    html_content = spider.get_html_content(target_url)
    if html_content:
        result_list = spider.parse_html(html_content)
        spider.store_data(result_list)
    else:
        print("网页访问失败")
    driver.close()  # 关闭浏览器

爬虫项目实战:爬虫模板爬取单位净值 (动态更新网址)

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import json
import pandas as pd

# Step 1: 访问网页并获取响应内容
def get_html_content(url):
    headers = {
        'User-Agent': UserAgent().random
    } # 请求头,爬虫程序通过加上请求头伪装成浏览器
    data={'name':'huoyouxing'}
    try:
        response = requests.post(url, data=data, headers=headers)
        response.raise_for_status()  # 判断返回的Response类型状态是不是200
        response.encoding = response.apparent_encoding  # 从内容中分析出的响应内容编码
        html_content = response.text # 网页内容
        return html_content # 返回网页内容
    except Exception as e:
        print(f"网络请求异常:{e}")
        return None

# Step 2: 解析网页并提取目标数据
def parse_html(html_content):
    # TODO:根据需求编写解析代码,并将结果保存到合适的数据结构中
    data_list=json.loads(html_content[16:])
    return data_list

# Step 3: 存储数据到本地或其他持久化存储服务器中
def store_data(result_list):
    # TODO:编写存储代码,将数据结果保存到本地或其他服务器中
    with open('华夏成长混合单位净值.csv','w') as file:
        data = pd.DataFrame(result_list)
        data.columns=('日期','单位净值')
        print(data)
        data.to_csv(file,line_terminator='\n',index=False)
    pass

# Step 4: 控制流程,调用上述函数完成数据抓取任务
if __name__ == '__main__':
    target_url = "https://fund.10jqka.com.cn/000001/json/jsondwjz.json"
    html_content = get_html_content(target_url)
    if html_content:
        result_list = parse_html(html_content)
        store_data(result_list)
    else:
        print("网页访问失败")

你可能感兴趣的:(爬虫,selenium,测试工具,python)