爬虫进阶:反反爬虫技术--4 爬虫访问速度和路径的控制

有一些防护措施完备的网站可能会阻止你快速地提交表单,或者快速地与网站进行交互。即使没有这些安全措施,用一个比普通人快很多的速度从一个网站下载大量信息也可能让自己被网站封杀。

因此,虽然多线程程序可能是一个快速加载页面的好办法——在一个线程中处理数据,另一个线程中加载页面——但是这对编写好的爬虫来说是恐怖的策略。还是应该尽量保证一次加载页面加载且数据请求最小化。如果条件允许,尽量为每个页面访问增加一点儿时间间隔,即使你要增加一行代码:

time.sleep(3)
–这里也可以设置1-5之间的随机整数

合理控制速度是你不应该破坏的规则。过度消耗别人的服务器资源会让你置身于非法境地,更严重的是这么做可能会把一个小型网站拖垮甚至下线。拖垮网站是不道德的,是彻头彻尾的错误。所以请控制采集速度!

常见表单反爬虫安全措施解密

许多像 Litmus 之类的测试工具已经用了很多年了,现在仍用于区分网络爬虫和使用浏览器的人类访问者,这类手段都取得了不同程度的效果。虽然网络机器人下载一些公开的文章和博文并不是什么大事,但是如果网络机器人在你的网站上创造了几千个账号并开始向所有用户发送垃圾邮件,就是一个大问题了。网络表单,尤其是那些用于账号创建和登录的网站,如果被机器人肆意地滥用,网站的安全和流量费用就会面临严重威胁,因此努力限制网站的接入是最符合许多网站所有者的利益的(至少他们这么认为)。

这些集中在表单和登录环节上的反机器人安全措施,对网络爬虫来说确实是严重的挑战。
关于这一点,我有段关于验证码测试的代码,就可能是这方面的问题,登陆用户名密码秒输入,然后selenium chrome就关闭了

#coding:utf-8
from selenium import webdriver
import random
import tesserocr
import re
import requests
import pytesseract
from selenium import webdriver
from PIL import Image, ImageEnhance

#代理池
def get_proxy():
    ProxyFile = r"D:\Python Programs\Crawler\Web Crawler\verified.txt"
    proxys = []
    for line in open(ProxyFile, "r"):
        proxys.append(line.strip('\n\r'))
    fakepxs = proxys[random.randint(0, len(proxys)-1)]
    return fakepxs

#selenium模拟浏览
def Selenium_Chrome_Test():
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--proxy-server={0}'.format(get_proxy()))
    browser = webdriver.Chrome(chrome_options=chrome_options)
    browser.get('https://www.baidu.com')
    print(browser.page_source)
    browser.close()

def tesserocr_test():
    image = Image.open('D:\Test\image.png')
    print(tesserocr.image_to_text(image))

def pytesseract_test():
    image = Image.open('D:\Test\image.png')
    code = pytesseract.image_to_string(image)
    print(code)

def loginBaidu():
    username = "13651480604"
    password = "huoyingchong64"
    loginurl = 'https://passport.baidu.com/v2/?login'
    # 截图或验证码图片保存地址
    screenImg = "D:/Test/screenImg.png"
    # 打开浏览器
    # 进入浏览器设置
    options = webdriver.ChromeOptions()
    # 设置中文
    options.add_argument('lang=zh_CN.UTF-8')
    # 更换头部
    options.add_argument(
        'user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"')

    driver = webdriver.Chrome(chrome_options=options)
    driver.get(loginurl)
    driver.implicitly_wait(1)#隐式等待,针对Driver 每次执行命令的 最长执行时间也可以理解为超时时间

    # cookie= driver.get_cookies()
    assert "登录百度帐号" in driver.title
    driver.find_element_by_id("TANGRAM__PSP_3__footerULoginBtn").click()
    driver.implicitly_wait(1)
    # 数据账号&密码(此处不提交)
    driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(username)
    driver.implicitly_wait(0.5)
    driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(password)
    driver.implicitly_wait(2)
    # 用于测试,此处可提前提交,让登录出错,页面出现验证码
    driver.find_element_by_id("TANGRAM__PSP_3__submit").click()

    # 获取验证码URL地址
    imgsrc = driver.find_element_by_id("TANGRAM__PSP_3__verifyCodeImg").get_attribute('src')

    # 如果匹配验证码路径成功(说明有提示输入验证码),则需读取验证码!
    if re.match(r'https://passport.baidu.com/cgi-bin/genimage.*', imgsrc):
        # 浏览器页面截屏
        driver.get_screenshot_as_file(screenImg)
        # 定位验证码位置及大小
        location = driver.find_element_by_id('TANGRAM__PSP_3__verifyCodeImg').location
        size = driver.find_element_by_id('TANGRAM__PSP_3__verifyCodeImg').size
        left = location['x']
        top = location['y']
        right = location['x'] + size['width']
        bottom = location['y'] + size['height']
        # 从文件读取截图,截取验证码位置再次保存
        img = Image.open(screenImg).crop((left, top, right, bottom))
        img = img.convert('L')  # 转换模式:L | RGB
        img = ImageEnhance.Contrast(img)  # 增强对比度
        img = img.enhance(2.0)  # 增加饱和度
        img.save(screenImg)
        # 再次读取识别验证码
        img = Image.open(screenImg)
        code = pytesseract.image_to_string(img)
        # code= pytesser.image_file_to_string(screenImg)
        driver.find_element_by_id("TANGRAM__PSP_3__verifyCode").send_keys(code.strip())
        print(code.strip())
    # 提交登录
    driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
    driver.implicitly_wait(10)
    driver.quit()

if __name__ == '__main__':
    loginBaidu()

算是我还没有解决的问题,目前还在努力的学习中。。

猜你喜欢

转载自blog.csdn.net/huoyingchong64/article/details/89707518