爬虫代理中Cookie的优化和生成

laical · 2020-08-11 17:25:33 · 3508 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-08-11 17:25:33 的主题,其中的信息可能已经有所发展或是发生改变。

当服务器向互联网网站发出HTTP请求的时候,HTTP请求会携带cookie cookie的用途: cookie一般可以用来记录数据信息 服务器可以通过document.cookie来访问cookie。 cookie在不同的域名中访问cookie时必须访问相应域名的cookie cookie的特点: 1、浏览器发出http请求会自动带上cookie 2、http请求的cookie需要和域名对应 cookie的优化: 1、从安全程度上考虑,一般建议用token,来保持回话。 2、从http请求减少,降低cookie的信息内容 3、因为cookie的基本作用,所以在发出http请求时,使用cookie获取其他相关图片数据等可以用到CDN上。就不会再带上cookie,这样获取的数据速度会快很多。 4、cookie最好是登陆获取的,一般访客的cookie,对方限制会比较严格,可以控制一个地区新访客的访问频率。另外反爬统计的js也要分析下,是不是做了机器人判断,有没有做窗口分辨率判断 生成cookies 我们使用chrome driver来进行登录和cookie的生成 import os import time import zipfile from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait class GenCookies(object): USER_AGENT = open('useragents.txt').readlines()

# 16yun 代理配置
PROXY_HOST = 't.16yun.cn'  #  proxy or host
PROXY_PORT = 31111  # port
PROXY_USER = 'USERNAME'  # username
PROXY_PASS = 'PASSWORD'  # password

@classmethod
def get_chromedriver(cls, use_proxy=False, user_agent=None):
    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Chrome Proxy",
        "permissions": [
            "proxy",
            "tabs",
            "unlimitedStorage",
            "storage",
            "<all_urls>",
            "webRequest",
            "webRequestBlocking"
        ],
        "background": {
            "scripts": ["background.js"]
        },
        "minimum_chrome_version":"22.0.0"
    }
    """
    background_js = """
    var config = {
            mode: "fixed_servers",
            rules: {
            singleProxy: {
                scheme: "http",
                host: "%s",
                port: parseInt(%s)
            },
            bypassList: ["localhost"]
            }
        };
    chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
    function callbackFn(details) {
        return {
            authCredentials: {
                username: "%s",
                password: "%s"
            }
        };
    }
    chrome.webRequest.onAuthRequired.addListener(
                callbackFn,
                {urls: ["<all_urls>"]},
                ['blocking']
    );
    """ % (cls.PROXY_HOST, cls.PROXY_PORT, cls.PROXY_USER, cls.PROXY_PASS)
    path = os.path.dirname(os.path.abspath(__file__))
    chrome_options = webdriver.ChromeOptions()
    if use_proxy:
        pluginfile = 'proxy_auth_plugin.zip'
        with zipfile.ZipFile(pluginfile, 'w') as zp:
            zp.writestr("manifest.json", manifest_json)
            zp.writestr("background.js", background_js)
        chrome_options.add_extension(pluginfile)
    if user_agent:
        chrome_options.add_argument('--user-agent=%s' % user_agent)
    driver = webdriver.Chrome(
        os.path.join(path, 'chromedriver'),
        chrome_options=chrome_options)
    return driver
def __init__(self, username, password):
    self.url = 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https://m.weibo.cn/'
    self.browser = self.get_chromedriver(use_proxy=True, user_agent=self.USER_AGENT)
    self.wait = WebDriverWait(self.browser, 20)
    self.username = username
    self.password = password
def open(self):
    """
    打开网页输入用户名密码并点击
    :return: None
    """
    self.browser.delete_all_cookies()
    self.browser.get(self.url)
    username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName')))
    password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword')))
    submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction')))
    username.send_keys(self.username)
    password.send_keys(self.password)
    time.sleep(1)
    submit.click()
def password_error(self):
    """
    判断是否密码错误
    :return:
    """
    try:
        return WebDriverWait(self.browser, 5).until(
            EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))
    except TimeoutException:
        return False
def get_cookies(self):
    """
    获取Cookies
    :return:
    """
    return self.browser.get_cookies()
def main(self):
    """
    入口
    :return:
    """
    self.open()
    if self.password_error():
        return {
            'status': 2,
            'content': '用户名或密码错误'
        }
    # 如果不需要验证码直接登录成功
    cookies = self.get_cookies()
    return {
        'status': 1,
        'content': cookies
    }

if name == 'main': result = GenCookies( username='180000000', password='16yun', ).main() print(result) 大部分商业网站需要我们登录后才能爬取内容,所以对于爬虫来说,生成cookies给代理使用成为了一个必须要做的事情。当使用亿牛云爬虫代理向目标网站发出的HTTP请求也必须带cookie信息,这样才能更加的高效稳定的采集相关数据。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3508 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传