1. 程式人生 > >Python爬蟲scrapy框架Cookie池(微博Cookie池)的使用

Python爬蟲scrapy框架Cookie池(微博Cookie池)的使用

下載程式碼Cookie池(這裡主要是微博登入,也可以自己配置置其他的站點網址)

下載安裝過後注意看網頁下面的相關基礎配置和操作!!!!!!!!!!!!!

自己的設定主要有下面幾步:

1、配置其他設定

2、設定使用的瀏覽器

3、設定模擬登陸

原始碼cookies.py的修改(以下兩處不修改可能會產生bug)

4、獲取cookie

隨機獲取Cookies: http://localhost:5000/weibo/random(注意:cookie使用時是需要後期處理的!!)

簡單的處理方式,如下程式碼(偶爾需要對獲取的cookie處理):

 def get_cookie(self):
        return requests.get('http://127.0.0.1:5000/weibo/random').text

    def stringToDict(self,cookie):
        itemDict = {}
        items = cookie.replace(':', '=').split(',')
        for item in items:
            key = item.split('=')[0].replace(' ', '').strip(' "')
            value = item.split('=')[1].strip(' "')
            itemDict[key] = value
        return itemDict

    def start_requests(self):
        ua = UserAgent()
        headers = {
            'User-Agent': ua.random,
            }
        cookies = self.stringToDict(str(self.get_cookie().strip('{|}')))

        yield scrapy.Request(url=self.start_urls[0], headers=headers,
                             cookies=cookies, callback=self.parse)
cookies = self.stringToDict(str(self.get_cookie().strip('{|}'))) yield scrapy.Request(url=self.start_urls[0], headers=headers, cookies=cookies, callback=self.parse)

scrapy爬蟲的使用示例(爬取微博):

middlewares.py中自定義請求中介軟體

import requests
import logging
import json
# 自定義微博請求的中介軟體
class WeiBoMiddleWare(object):
    def __init__(self, cookies_pool_url):
        self.logging = logging.getLogger("WeiBoMiddleWare")
        self.cookies_pool_url = cookies_pool_url

    def get_random_cookies(self):
        try:
            response = requests.get(self.cookies_pool_url)
        except Exception as e:
            self.logging.info('Get Cookies failed: {}'.format(e))
        else:
            # 在中介軟體中,設定請求頭攜帶的Cookies值,必須是一個字典,不能直接設定字串。
            cookies = json.loads(response.text)
            self.logging.info('Get Cookies success: {}'.format(response.text))
            return cookies

    @classmethod
    def from_settings(cls, settings):
        obj = cls(
            cookies_pool_url=settings['WEIBO_COOKIES_URL']
        )
        return obj

    # process_request()該方法會被多次呼叫,每一個request請求都會經過這個方法交給downloader
    def process_request(self, request, spider):
        request.cookies = self.get_random_cookies()
        return None

    def process_response(self, request, response, spider):
        """
        對此次請求的響應進行處理。
        :param request:
        :param response:
        :param spider:
        :return:
        """
        # 攜帶cookie進行頁面請求時,可能會出現cookies失效的情況。訪問失敗會出現兩種情況:1. 重定向302到登入頁面;2. 也能會出現驗證的情況;

        # 想攔截重定向請求,需要在settings中配置。
        if response.status in [302, 301]:
            # 如果出現了重定向,獲取重定向的地址
            redirect_url = response.headers['location']
            if 'passport' in redirect_url:
                # 重定向到了登入頁面,Cookie失效。
                self.logging.info('Cookies Invaild!')
            if '驗證頁面' in redirect_url:
                # Cookies還能繼續使用,針對賬號進行的反爬蟲。
                self.logging.info('當前Cookie無法使用,需要認證。')

            # 如果出現重定向,說明此次請求失敗,繼續獲取一個新的Cookie,重新對此次請求request進行訪問。
            request.cookies = self.get_random_cookies()
            # 返回值request: 停止後續的response中介軟體,而是將request重新放入排程器的佇列中重新請求。
            return request

        # 如果沒有出現重定向,直接將response向下傳遞後續的中介軟體。
        return response

settings.py 中的配置:

5、錄入賬號和密碼:

格式規定(賬號----密碼)

6、驗證:(注意:使用cmd)

7、使用時注意保持cmd開啟執行!!

使用時一定要開啟cmd,並執行如第6步。

得到Cookie是判斷是否處理處理Cookie(幾乎都需要!!)類比第4步!!!