【Python爬虫】动态IP+多线程下载+Selenium

这篇具有很好参考价值的文章主要介绍了【Python爬虫】动态IP+多线程下载+Selenium。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、动态IP

1. 三种代理模式

2. 实用代理平台

3. 测试代理IP能不能用

4. 伪装请求头User-Agent

二、多线程下载

三、Selenium爬虫

1. 爬取班级同学的录取情况

四、常用操作与个人经验

1. 遍历list下的内容

2. 个人经验


一、动态IP

        首先介绍动态IP的重要性。

        在数据量较小的情况下,本地IP访问量不大,不会出现问题。但是在数据量较大的情况下,如果不采用动态IP的问题,那么会导致IP被对方网站拉黑,甚至在浏览器都打不开对方网址,更不要说爬虫或下载任务。因此,IP代理十分重要。


1. 三种代理模式

(1) 透明代理

        代理服务器将客户端的信息转发至目标访问对象,并没有完全隐藏客户端真实的身份。即服务器知道客户端使用了代理IP,并且知道客户端的真实IP地址。

(2) 普通匿名代理

        代理服务器用自己的IP代替了客户端的真实IP,但是告诉了目标访问对象这是代理访问。

(3) 高匿代理

        代理服务器良好地伪装了客户端,不但用一个随机的IP代替了客户端的IP,也隐藏了代理信息,服务器不会察觉到客户端是通过代理实现访问的,即用户仿佛就是直接使用代理服务器作为自己的客户端。

        爬虫时,需要使用高匿代理。


2. 实用代理平台

        代理IP的平台很多,较为正式且实测有效的是一种资源。2个较为全面的介绍如下:

        ①https://zhuanlan.zhihu.com/p/290719786

        ②https://zhuanlan.zhihu.com/p/33576641

         代理可分为2大类:IP池和隧道代理。

        IP池可以认为是存储很多可用IP的池子,需要时把IP拿出来使用。

        隧道代理则是提供一个隧道,隧道那端自动切换IP返回。

        由此可知,爬虫时主要使用隧道代理

(1)快代理

        经过测试,快代理可以正常使用,但无法访问国外网站,甚至有些在国内可以访问的国外网址都无法访问(没有测试过快代理的隧道代理是否也有这个问题)。

(2)小象代理

         经过测试,小象代理可以正常使用。


3. 测试代理IP能不能用

# 测试代理IP能不能用
# print(requests.get('http://httpbin.org/ip', proxies=proxies, timeout=5).text)

4. 伪装请求头User-Agent

from fake_useragent import UserAgent
# 随机请求头
headers = {'User-Agent':UserAgent().random}
res = requests.get(url,headers = headers,proxies = proxies)

         查看自己浏览器版本和请求头:浏览器输入about:version

selenium实现动态ip,selenium,爬虫,python


二、多线程下载

        在得到目标url后,需要批量下载。下载方式有很多:多协程、多线程、多进程。

        可能本人对协程理解不深,使用时经常出现一些问题:如下载图片损坏等。可以部分参考本人之前博客(亲测有效)selenium+python爬虫实用技巧_uestc_hjw的博客-CSDN博客。

        实际使用的是多线程下载。

import requests
from multiprocessing.pool import ThreadPool # 线程池:使用方法和Pool一样
# from multiprocessing.dummy import Pool as ThreadPool # 两种线程池都可以
# from multiprocessing import Pool # 进程池
# 进程教程:https://docs.python.org/zh-cn/3/library/multiprocessing.html
import os
from tqdm import tqdm
from fake_useragent import UserAgent

def download():
    txt_path = './Data.txt'
    Img_path = './Images/'
    thread_num = 16 # 线程数
    os.makedirs(Img_path,exist_ok=True)
    # 所有要下载的数量
    with open(txt_path,'r') as f:
        datas = f.readlines()
    ''' 中间的处理步骤 '''
    ''' 要达成的效果:datas是一个list:第一项是url, 第二项是保存路径 '''
    datas = [['url1','save_path1'],['url2','save_path2'],...]
    # 多线程下载
    gg = ThreadPool(thread_num).imap_unordered(download_one,datas)
    for _ in tqdm(gg):
        pass

def download_one(data):
    name = 'xx' # 文件名
    try:
        # session = requests.Session()
        while 1:
            res = requests.get(data[0],headers = headers,proxies = proxies)
            if res.status_code == 200: # 200是正常访问
                break
            if res.status_code == 500: # 除了503问题外,对方网站可能出现500问题,即他的问题,所以一直等就卡着了
                with open(f'./No_content_{name}.txt','a') as f:
                    f.write(data[0] + '!!' + data[1] +'\n')
                return 0
        img = res.content
        if len(img)>5000:
            with open(data[1],'wb') as f:
                f.write(img)
        else:
            with open(f'./No_content_{name}.txt','a') as f:
                f.write(data[0] + '!!' + data[1] +'\n')
    except:
        pass

if __name__ == '__main__':
    download()

三、Selenium爬虫

1. 爬取班级同学的录取情况

任务说明:根据excel提供的班级花名册,在网页上找到同学的录取信息


(1)提取Excel

selenium实现动态ip,selenium,爬虫,python

roster_path = r'D:\2022秋季学期课程\2022级人工智能学院1603班花名册.xlsx'
web_path = "http://ia.cas.cn/yjsjy/zs/sszs/202110/t20211009_6219697.html"
roster = pandas.read_excel(roster_path)
data = roster.iloc[:,3].values[1:]
print(data)

(2)网页信息示意

url:2022年自动化所推免直博和硕士生拟录取名单公示----自动化研究所 (cas.cn)

selenium实现动态ip,selenium,爬虫,python


(3)完整代码

import pandas
import time
import numpy as np

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# chrome version: 105.0.5195.127
roster_path = r'D:\2022秋季学期课程\2022级人工智能学院1603班花名册.xlsx'
web_path = "http://ia.cas.cn/yjsjy/zs/sszs/202110/t20211009_6219697.html"
roster = pandas.read_excel(roster_path)
data = roster.iloc[:,3].values[1:]
print(data)

output_path = r'D:\Vscode_Programming_Set\WebCrawler\Find_Classmates_of_1603.xlsx'
def Find_Classmates(web_path:str,data:list,output_path:str):
    options = webdriver.ChromeOptions()
    User_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.127 Safari/537.36 Edg/96.0.1054.57'
    options.add_argument('user-agent=' + User_Agent)     # UA代理
    options.add_argument("--window-size=1920,1080")
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    options.add_argument('--disable-gpu')
    browser = webdriver.Chrome(options=options,service = Service(r'D:\chromedriver\chromedriver.exe'))
    browser.get(web_path)
    name_list = browser.find_elements(By.XPATH,'//*[@id="zoom"]/div/div/table/tbody/tr')
    #                                           //*[@id="zoom"]/div/div/table/tbody/tr[2]/td[1]
    result = []
    for i in name_list:
        name = i.find_element(By.XPATH,'.//td[1]').text
        if name in data:
            result.append([name,i.find_element(By.XPATH,'.//td[2]').text,i.find_element(By.XPATH,'.//td[3]').text,i.find_element(By.XPATH,'.//td[4]').text,i.find_element(By.XPATH,'.//td[8]').text])

    df = pandas.DataFrame(result,columns=['Name','admission_type','Gender','School','Tutor'])
    df.to_excel(output_path,index=False)

Find_Classmates(web_path,data,output_path)

(4)实现效果

selenium实现动态ip,selenium,爬虫,python


四、常用操作与个人经验

1. 遍历list下的内容

selenium实现动态ip,selenium,爬虫,python

name_list = browser.find_elements(By.XPATH,'//*[@id="zoom"]/div/div/table/tbody/tr')
#                                           //*[@id="zoom"]/div/div/table/tbody/tr[2]/td[1]
result = []
for i in name_list:
    name = i.find_element(By.XPATH,'.//td[1]').text  # 这个.很重要

2. 个人经验

(1)requests.get()正常返回200,但也会出现500,即对方错误,和url本身就不存在图像的可能。因此要判断len(content)的大小,符合要求再下载。

(2)网络波动或禁止访问,导致爬取内容可能重复。因此要判断当前内容是否已经出现,否则一直等待。文章来源地址https://www.toymoban.com/news/detail-517389.html

到了这里,关于【Python爬虫】动态IP+多线程下载+Selenium的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现透明隧道爬虫ip:不影响现有网络结构

    作为一名专业爬虫程序员,我们常常需要使用隧道代理来保护个人隐私和访问互联网资源。本文将分享如何使用Python实现透明隧道代理,以便在保护隐私的同时不影响现有网络结构。通过实际操作示例和专业的解析,我们将带您深入了解透明隧道代理的工作原理,并提供实用

    2024年02月12日
    浏览(44)
  • 使用Python实现爬虫IP负载均衡和高可用集群

    做大型爬虫项目经常遇到请求频率过高的问题,这里需要说的是使用爬虫IP可以提高抓取效率,那么我们通过什么方法才能实现爬虫IP负载均衡和高可用集群,并且能快速的部署并且完成爬虫项目。 通常在Python中实现爬虫ip负载均衡和高可用集群需要一些高级的网络和编程知识

    2024年02月04日
    浏览(54)
  • Python爬虫:实现爬取、下载网站数据的几种方法

    使用脚本进行下载的需求很常见,可以是常规文件、web页面、Amazon S3和其他资源。Python 提供了很多模块从 web 下载文件。下面介绍 requests 模块是模仿网页请求的形式从一个URL下载文件 示例代码: 安装 wget 库 示例代码 有些 URL 会被重定向到另一个 URL,后者是真正的下载链接

    2024年02月05日
    浏览(73)
  • HTTP/HTTPS代理IP在多线程爬虫项目中的实践

    在多线程爬虫项目中,HTTP/HTTPS代理IP的实践主要包括以下几个关键步骤: 1. 收集代理IP资源:    - 从免费或付费代理IP提供商、公开代理列表网站(如西刺代理、无忧代理等)抓取代理IP和端口信息。    - 存储这些IP到数据库或者文件中,格式通常为`ip:port`。 2. 构建代理池

    2024年01月22日
    浏览(54)
  • 利用Python中selenium库爬虫实现中国裁判文书网自动登录批量下载功能——最新版详细教程!!

    如果电脑上没有chrome浏览器或者当前chrome浏览器不是最新版,请先去chrome官网下载安装最新版chrome浏览器 https://www.google.cn/chrome/index.html 什么是ChromeDriver ChromeDriver是一种用于自动化和控制Google Chrome浏览器的工具。它是一个开源的项目,由Google维护,并提供给开发者使用。Ch

    2024年02月04日
    浏览(117)
  • Python爬虫:单线程、多线程、多进程

    在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 进程可以理解为是正在运行的程序的实例。进程是拥有资源的独立单位,而线程不是独立的

    2024年02月13日
    浏览(41)
  • python+Selenium多线程后台爬虫例子

    Selenium多线程后台爬虫 一、前言: 有些网站不支持网页源码爬虫、或要爬取的网页内容不在网页源码中, 等需要使用Selenium进行爬虫 二、准备工作: 安装selenium及对应googlechrome浏览器 安装方法:参考安装教程 三、多线程原理: 1、利用同一个浏览器打开多页面、相当于打开

    2024年02月12日
    浏览(35)
  • Python多线程爬虫为何效率低下?解析原因并提高爬虫速度的方法

    线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属的一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建

    2024年02月01日
    浏览(40)
  • 【Python爬虫与数据分析】进程、线程、协程

    目录 一、概述 二、进程的创建 三、线程的创建 四、协程的创建 五、全局变量的共享问题 六、消息队列与互斥锁 七、池化技术 进程是系统分配资源的基本单位,线程是CPU调度的基本单位。 一个进程可包含多个线程,一个线程可包含多个协程,协程就是最小的任务执行单位

    2024年02月13日
    浏览(40)
  • python 笔记(3)——request、爬虫、socket、多线程

    目录 1、使用requests发送http请求 1-1)发送get请求 1-2)发送 post 请求 1-3)发送 get 请求下载网络图片 1-4)使用 post 上传文件 1-5)自动维护 session 的方式 2、使用 os.popen 执行cmd命令 3、基于 beautifulSoup 的爬虫 3-1)初始化解析器 3-2)查找页面元素 3-2-1)find、findAll 3-2-2)使用css选

    2024年02月10日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包