最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于python scrapy中添加cookie踩坑記錄

 更新時間:2020年11月17日 10:32:01   作者:potato_big  
這篇文章主要介紹了關(guān)于python scrapy中添加cookie踩坑記錄,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

問題發(fā)現(xiàn):

前段時間項目中,為了防止被封號(提供的可用賬號太少),對于能不登錄就可以抓取的內(nèi)容采用不帶cookie的策略,只有必要的內(nèi)容才帶上cookie去訪問。

本來想著很簡單:在每個拋出來的Request的meta中帶上一個標志位,通過在CookieMiddleware中查看這個標志位,決定是否是給這個Request是否裝上Cookie。

實現(xiàn)的代碼大致如下:

class CookieMiddleware(object):
  """
  每次請求都隨機從賬號池中選擇一個賬號去訪問
  """

  def __init__(self):
    client = pymongo.MongoClient(MONGO_URI)
    self.account_collection = client[MONGO_DATABASE][ACCOUNT_COLLECTION]

  def process_request(self, request, spider):
    if 'target' in request.meta: 
      logging.debug('進入到process_request了')
      flag = request.meta['target']
      if flag != 'no':
        all_count = self.account_collection.find({'status': 'success'}).count()
        if all_count == 0:
          raise Exception('當前賬號池為空')
        random_index = random.randint(0, all_count - 1)
        random_account = self.account_collection.find({'status': 'success'})[random_index]
        
        request.cookies = json.loads(random_account['cookie'])
      else:
        logging.debug('對XXX的請求不做處理')
    else:
      all_count = self.account_collection.find({'status': 'success'}).count()
      if all_count == 0:
        raise Exception('當前賬號池為空')
      random_index = random.randint(0, all_count - 1)
      random_account = self.account_collection.find({'status': 'success'})[random_index]
      
      request.cookies = json.loads(random_account['cookie'])

在settings.py中的配置如下:

DOWNLOADER_MIDDLEWARES = {
  'eyny.middlewares.CookieMiddleware': 550,
}

到這里可能有些大佬已經(jīng)能夠看出端倪了,和我一樣認為這么寫沒啥問題的同志們繼續(xù)往下看。

在這么編寫完之后,我正常開啟了項目,還適當調(diào)高了并發(fā)量,然后第二天發(fā)現(xiàn)賬號被封了。在debug過程中看到在抓取不需要攜帶cookie的url的時候,依然攜帶了cookie,并且cookie是被放在了header中,經(jīng)過我花費了兩個多小時查看框架源碼之后,終于發(fā)現(xiàn)了原因。

原因&解決方案:

在scrapy的settings目錄下的default_settings.py文件中,初始聲明了一些DOWNLOADER_MIDDLEWARES_BASE,這些middlewares的聲明如下:

DOWNLOADER_MIDDLEWARES_BASE = {
  # Engine side
  'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
  'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
  'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
  'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
  'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
  'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
  'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
  'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
  'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
  'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
  'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
  'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
  'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
  'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
  # Downloader side
}

可以看到在DOWNLOADER_MIDDLEWARES_BASE中也聲明了一個CookiesMiddleware,而且是700,也就是說比我們寫的CookieMiddleware(500)要靠后執(zhí)行,而且在debug過程中也看到,在執(zhí)行完我們編寫的CookieMiddleware之后,header中沒有攜帶cookie,但是在執(zhí)行完scrapy.downloadermiddlewares.cookies.CookiesMiddleware: 700之后,在header中看到了cookie,這說明cookie是scrapy幫我們自動加了。

我們打開scrapy.downloadermiddlewares.cookies.CookiesMiddleware的實現(xiàn)源碼,主要關(guān)注process_request方法:

class CookiesMiddleware(object):
  """This middleware enables working with sites that need cookies"""

  def __init__(self, debug=False):
    self.jars = defaultdict(CookieJar)
    self.debug = debug

  @classmethod
  def from_crawler(cls, crawler):
    if not crawler.settings.getbool('COOKIES_ENABLED'):
      raise NotConfigured
    return cls(crawler.settings.getbool('COOKIES_DEBUG'))

  def process_request(self, request, spider):
    if request.meta.get('dont_merge_cookies', False):
      return

    cookiejarkey = request.meta.get("cookiejar")
    jar = self.jars[cookiejarkey]
    cookies = self._get_request_cookies(jar, request)
    for cookie in cookies:
      jar.set_cookie_if_ok(cookie, request)

    # set Cookie header
    request.headers.pop('Cookie', None)
    jar.add_cookie_header(request)
    self._debug_cookie(request, spider)

	def process_response(self, request, response, spider):
    if request.meta.get('dont_merge_cookies', False):
      return response

    # extract cookies from Set-Cookie and drop invalid/expired cookies
    cookiejarkey = request.meta.get("cookiejar")
    jar = self.jars[cookiejarkey]
    jar.extract_cookies(response, request)
    self._debug_set_cookie(response, spider)

    return response

在上面的代碼中,最中要的是process_request方法中的內(nèi)容,可以看到首先從request.meta中查看有沒有dont_merge_cookies屬性,如果沒有或者為false,就不運行剩下的方法,臥槽,這就是我們要找的方法呀!是不是好簡單…

特別注意如果要使用dont_merge_cookies=true,那么需要我們自己將cookie加入到header中,通過**request.cookies = json.loads(random_account[‘cookie'])**方式添加的cookie,scrapy也不再會幫我們合并到header 中了。

解決方案我們的解決方法就是在request的meta中加入dont_merge_cookies屬性,并設(shè)置為true,在CookieMiddleware中,我們將cookie添加在header中,而不是賦值給request.cookies

問題解決了,但是這么簡單是不是很不爽,所以就繼續(xù)想看看是為什么scrapy可以自動給我們加上cookie,這個接下來就需要讀下面的代碼了。

總結(jié)

到此這篇關(guān)于關(guān)于python scrapy中添加cookie踩坑記錄的文章就介紹到這了,更多相關(guān)scrapy cookie問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python高階函數(shù)functools模塊的具體使用

    python高階函數(shù)functools模塊的具體使用

    本文主要介紹了python高階函數(shù)functools模塊的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python實現(xiàn)二級登陸菜單及安裝過程

    python實現(xiàn)二級登陸菜單及安裝過程

    這篇文章主要介紹了python實現(xiàn)二級登陸菜單及安裝過程,,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • 使用Python設(shè)置、更改及移除Word文檔密碼

    使用Python設(shè)置、更改及移除Word文檔密碼

    給Word文檔設(shè)置打開密碼是常見的Word文檔加密方式,如果我們需要對大量的Word文檔進行加密、解密處理,Python是一個不錯的選擇,本文將介紹如何使用Python設(shè)置、更改或移除Word文檔的加密,需要的朋友可以參考下
    2024-03-03
  • 20個解決日常編程問題的Python代碼分享

    20個解決日常編程問題的Python代碼分享

    在這篇文章中,主要和大家分享了20個Python代碼片段,以幫助你應(yīng)對日常編程挑戰(zhàn)。文中的示例代碼講解詳細,感興趣的小伙伴可以跟上小編一起了解一下
    2023-01-01
  • 如何用python實現(xiàn)復(fù)制粘貼功能

    如何用python實現(xiàn)復(fù)制粘貼功能

    這篇文章主要介紹了如何用python實現(xiàn)復(fù)制粘貼功能,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • 使用PDB簡單調(diào)試Python程序簡明指南

    使用PDB簡單調(diào)試Python程序簡明指南

    這篇文章主要介紹了使用PDB簡單調(diào)試Python程序簡明指南,本文講解了使用PDB調(diào)試程序的簡單技巧,方便、簡潔實用,需要的朋友可以參考下
    2015-04-04
  • python如何實現(xiàn)圖片轉(zhuǎn)文字

    python如何實現(xiàn)圖片轉(zhuǎn)文字

    這篇文章主要介紹了python如何實現(xiàn)圖片轉(zhuǎn)文字問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • python爬蟲爬取淘寶商品信息

    python爬蟲爬取淘寶商品信息

    這篇文章主要為大家詳細介紹了python爬蟲爬取淘寶商品信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Apache,wsgi,django 程序部署配置方法詳解

    Apache,wsgi,django 程序部署配置方法詳解

    這篇文章主要介紹了Apache,wsgi,django 程序部署配置方法,結(jié)合實例形式詳細分析了Linux環(huán)境下Apache,wsgi,django程序部署配置的相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2019-07-07
  • python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié)

    python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié)

    這篇文章主要介紹了python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評論

平塘县| 丰宁| 扶绥县| 兴安盟| 潍坊市| 肇州县| 梁河县| 蓝田县| 余江县| 正镶白旗| 涪陵区| 拉萨市| 原阳县| 海兴县| 凤城市| 宜城市| 黑河市| 泸溪县| 漳浦县| 玛曲县| 大足县| 宁安市| 灵宝市| 高尔夫| 双峰县| 谢通门县| 姚安县| 凤山县| 图木舒克市| 怀柔区| 涟源市| 攀枝花市| 绥江县| 天津市| 保靖县| 西华县| 塘沽区| 延寿县| 临沂市| 荆州市| 甘谷县|