python爬虫—保持登录会话状态,爬取某个接口返回的数据

在爬取某个网站的数据时,有时只需要某个接口返回的数据。但是目前很多网站都做了限制,需要保持会话状态也就是登录的状态,那我们就要需要伪装登录。这里是以某网站为例,登录时选择账号登陆,用webdriver.Chrome启动网站然后手动输入账号密码。
在这里插入图片描述这里有个延时30s,所以30s内记得输入完账号登录,登录完后会保存cookies。用于后面的爬取接口数据时用。

可能遇到的问题

1.WebDriverException: ‘chromedriver’ executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
报这个类型错误,是安装webdriver的时候出问题,百度一下,安装这个有很多博客教程,但我要说的是在选择Anacondas3的时候,你下载的chromedriver.exe这个程序也要把它复制到Anacondas3所在的根目录下,比喻我的“D:\softs\Anaconda\chromedriver.exe”。不然就会报错。

2.关于headers问题
由于http1.0和http2.0之间的区别,具体什么区别网上也有很多解释。在携带的头部参数不要忘记了以下几个
:authority、:method、:scheme、:path以及referer。
记住前面的冒号不要丢哦,还有就是这个里面不能出错,你用谷歌浏览器F12看控制台里面,Request Headers里面别人怎么写你就怎么写。下面的一个问题就是我遇到的问题,原因就出在这个里面。

3.Response [400]错误
报这个错误的原因有很多,列如客户端给服务器端传递参数时,参数类型无法转换,所以建议get请求直接将参数写在url后面,别搞什么primes什么的。还有一个原因是我本人遇到的,想了很久不知道问题出在哪。唉,经验太少,代码能力太差,只能一个坑一个坑的踩了。就是我将:method后面值大写写成小写了,本来是headers[’:method’] =‘GET’这样的,我写成了headers[’:method’] ='get’了,所以一直报400错误。

 最后直接上代码吧
import requests
import time
from selenium import webdriver
import random
from hyper.contrib import HTTP20Adapter

storenames = []
arrlen = 0
storequeue = Queue(10000)
stop = False
requests.adapters.DEFAULT_RETRIES = 5 # 增加重连次数
s = requests.session()
s.keep_alive = False # 关闭多余连接
sessions=requests.session()
sessions.mount('只要爬取的网站', HTTP20Adapter())
storesqlqueue = Queue(50000)
chrome_options = webdriver.ChromeOptions()
# 使用headless无界面浏览器模式
# chrome_options.add_argument('--headless') #增加无界面选项
chrome_options.add_argument('--disable-gpu') #如果不加这个选项,有时定位会出现问题
  
#获取登陆cookies
def LoginCookies():    
    browser = webdriver.Chrome(chrome_options=chrome_options)
    mainUrl = "只要爬取的网站登录页面URL"
    browser.get(mainUrl)
    time.sleep(30)  
    cookies=browser.get_cookies()
    cookiesStr=''
    for cookie in cookies:
        cookiesStr = cookiesStr + str(cookie['name'])+'='+cookie['value']+';'


    headers = {}
    user_agent_list = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
                "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
                ]


    url = '放入自己需要爬取的接口'
    pindex = random.randint(0,5)
    headers['User-Agent'] = user_agent_list[pindex]
    headers['Accept-Encoding'] = 'gzip, deflate, br'
    headers['Accept'] = 'application/json, text/plain, */*'
    #headers['Accept-language'] = 'zh-CN,zh;q=0.9'
    headers['Cookie']  =cookiesStr
    headers[':authority']  ='放入自己的需要的'
    headers[':scheme']  ='https'
    headers[':path']  =''
    headers['sec-fetch-mode']  = 'cors'
    headers['sec-fetch-site']  = 'same-origin'
    headers['referer']  = '放入自己的需要的'
    try:
        res=sessions.get(url,headers=headers)
        print(res)
        orderinfo = res.json().get('data')
        print(orderinfo)
    except Exception as e:
        print('Error:',e)      
if __name__ == '__main__':   
   LoginCookies()   

版权声明:本文为weixin_43714488原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。