python爬虫针对需要登陆操作的技巧分析

2023-05-05 16:22:42 浏览数 (1)

在日常爬虫中我们经常会遇到一些目标网站需要带上cookie才能获取数据,cookie指某些网站为了辨别用户身份、进行sessionn跟踪而储存在用户本地终端上的数据(通常经过加密)。

举个例子,某些网站是需要登录后才能得到你想要的信息的,不登陆只能是游客模式,那么我们可以利用Urllib2库保存我们以前登录过的Cookie,之后载入cookie获取我们想要的页面,然后再进行抓取。所以cookie主要是为我们快捷模拟登录抓取目标网页做出准备。一般来说我们实现请求大致也有两种方式,第一种是selenium,第二种是包含requests,urllib等的其他类型,那么cookie的获取也是针对这样的结构而言的。比如这里我们可以利用selenium phantomjs无界面浏览器的形式访问网站,再获取cookie值:

代码语言:javascript复制
# 导入模块
from selenium import webdriver
 
driver=webdriver.PhantomJS()
url="https://et.xiamenair.com/xiamenair/book/findFlights.action?lang=zh&tripType=0&queryFlightInfo=XMN,PEK,2018-01-15"
driver.get(url)

#接下来注意了,要开始获取cookie了.

# 获取cookie列表
cookie_list=driver.get_cookies()#这里主要是使用自带的get_cookies方法

# 格式化打印cookie
for cookie in cookie_list:
    cookie_dict[cookie['name']]=cookie['value']
print(cookie_dict)

一般需要进行登陆后再操作的网站在爬取的时候对IP的限制都是比较严的,这种情况下就需要添加代理IP池,建议可以选择亿牛云提供的爬虫隧道加强版IP池,因为可以设置用户自主切换IP,爬虫程序可以通过设置HTTP头Proxy-Tunnel: 随机数,将不同的请求强制指定为一个代理IP或不同代理IP;该模式适合一些需要登陆(多个session使用相同IP)、Cookie缓存处理等需要精确控制IP切换时机的业务,代码实现过程如下:

代码语言:javascript复制
 #! -*- encoding:utf-8 -*-
    import urllib2
    import random
    import httplib


    class HTTPSConnection(httplib.HTTPSConnection):

        def set_tunnel(self, host, port=None, headers=None):
            httplib.HTTPSConnection.set_tunnel(self, host, port, headers)
            if hasattr(self, 'proxy_tunnel'):
                self._tunnel_headers['Proxy-Tunnel'] = self.proxy_tunnel


    class HTTPSHandler(urllib2.HTTPSHandler):
        def https_open(self, req):
            return urllib2.HTTPSHandler.do_open(self, HTTPSConnection, req, context=self._context)


    # 要访问的目标页面
    targetUrlList = [
        "https://httpbin.org/ip",
        "https://httpbin.org/headers",
        "https://httpbin.org/user-agent",
    ]

    # 代理服务器(产品官网 www.16yun.cn)
    proxyHost = "t.16yun.cn"
    proxyPort = "31111"

    # 代理验证信息
    proxyUser = "username"
    proxyPass = "password"

    proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
        "host": proxyHost,
        "port": proxyPort,
        "user": proxyUser,
        "pass": proxyPass,
    }

    # 设置 http和https访问都是用HTTP代理
    proxies = {
        "http": proxyMeta,
        "https": proxyMeta,
    }

    #  设置IP切换头
    tunnel = random.randint(1, 10000)
    headers = {"Proxy-Tunnel": str(tunnel)}
    HTTPSConnection.proxy_tunnel = tunnel


    proxy = urllib2.ProxyHandler(proxies)
    opener = urllib2.build_opener(proxy, HTTPSHandler)
    urllib2.install_opener(opener)

    # 访问三次网站,使用相同的tunnel标志,均能够保持相同的外网IP
    for i in range(3):
        for url in targetUrlList:
            r = urllib2.Request(url)
            print(urllib2.urlopen(r).read())

0 人点赞