日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫进阶:反反爬虫技巧

發布時間:2024/5/14 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫进阶:反反爬虫技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主要針對以下四種反爬技術:Useragent過濾;模糊的Javascript重定向;驗證碼;請求頭一致性檢查。

高級網絡爬蟲技術:繞過 “403 Forbidden”,驗證碼等

爬蟲的完整代碼可以在 github 上對應的倉庫里找到。

簡介

我從不把爬取網頁當做是我的一個愛好或者其他什么東西,但是我確實用網絡爬蟲做過很多事情。因為我所處理的許多工作都要求我得到無法以其他方式獲得的數據。我需要為 Intoli 做關于游戲數據的靜態分析,所以我爬取了Google應用商店的數據來尋找最新被下載的APK。Pointy Ball插件需要聚合來自不同網站的夢幻足球(游戲)的預測數據,最簡單的方式就是寫一個爬蟲。在我在考慮這個問題的之前,我大概已經寫了大約 40~50 個爬蟲了。我不太記得當時我對我家人撒謊說我已經抓取了多少 TB 的數據….,但是我確實很接近那個數字了。

我嘗試使用?xray/cheerio、nokogiri?和一些其他的工具。但我總是會回到我個人的最愛?Scrapy。在我看來,Scrapy是一個出色的軟件。我對這款軟件毫無保留的贊美是有原因的,它的用法非常符合直覺,學習曲線也很平緩。

你可以閱讀Scrapy的教程,在幾分鐘內就可以讓你的第一個爬蟲運行起來。然后,當你需要做一些更復雜的事情的時候,你就會發現,有一個內置的、有良好文檔說明的方式來做到這一點。這個框架有大量的內置功能,但是它的結構使得在你用到這些功能之前,不會妨礙到你。當你最終確實需要某些默認不存在的功能的時候,比如說,因為訪問了太多的 URL 鏈接以至于無法存儲到內存中,需要一個用于去重的 bloom filter(布隆過濾器),那么通常來說這就和繼承其中的組件,然后做一點小改動一樣簡單。一切都感覺如此簡單,而且scrapy是我書中一個關于良好軟件設計的例子。

我很久以前就想寫一個高級爬蟲教程了。這給我一個機會來展示scrapy的可擴展性,同時解決實踐中出現的現實問題。盡管我很想做這件事,但是我還是無法擺脫這樣一個事實:因為發布一些可能導致他人服務器由于大量的機器人流量受到損害的文章,就像是一個十足的壞蛋。

只要遵循幾個基本的規則,我就可以在爬取那些有反爬蟲策略的網站的時候安心地睡個好覺。換句話說,我讓我的請求頻率和手動瀏覽的訪問頻率相當,并且我不會對數據做任何令人反感的事情。這樣就使得運行爬蟲收集數據基本上和以其他主要的手動收集數據的方法無法區分。但即使我遵守了這些規則,我仍感覺為人們實際想要爬取的網站寫一個教程有很大的難度。

直到我遇到一個叫做Zipru的BT下載網站,這件事情仍然只是我腦海里一個模糊的想法。這個網站有多個機制需要高級爬取技術來繞過,但是它的 robots.txt 文件卻允許爬蟲爬取。此外,其實我們不必去爬取它。因為它有開放的API,同樣可以得到全部數據。如果你對于獲得torrent的數據感興趣,那就只需要使用這個API,這很方便。

在本文的剩余部分,我將帶領你寫一個爬蟲,處理驗證碼和解決我們在Zipru網站遇到的各種不同的挑戰。樣例代碼無法被正常運行因為 Zipru 不是一個真實存在的網站,但是爬蟲所使用的技術會被廣泛應用于現實世界中的爬取中。因此這個代碼在另一個意義上來說又是完整的。我們將假設你已經對 Python 有了基本的了解,但是我仍會盡力讓那些對于?Scrapy 一無所知的人看懂這篇文章。如果你覺得進度太快,那么花幾分鐘的時間閱讀一下Scrapy官網教程吧。

號:923414804
群里有志同道合的小伙伴,互幫互助,
群里有不錯的視頻學習教程和PDF!

建立工程項目

我們會在?virtualenv?中建立我們的項目,這可以讓我們封裝一下依賴關系。首先我們在~/scrapers/zipru中創建一個virtualenv ,并且安裝scrapy包。

Python
1 2 3 4 5 mkdir ~/scrapers/zipru cd ~/scrapers/zipru virtualenv env . env/bin/activate pip install scrapy

你運行的終端將被配置為使用本地的virtualenv。如果你打開另一個終端,那么你就需要再次運行. ~/scrapers/zipru/env/bin/active?命令 (否則你有可能得到命令或者模塊無法找到的錯誤消息)。

現在你可以通過運行下面的命令來創建一個新的項目框架:

Python
1 scrapy startproject zipru_scraper

這樣就會創建下面的目錄結構。

Python
1 2 3 4 5 6 7 8 9 10 └── zipru_scraper ????├── zipru_scraper ????│?? ├── __init__.py ????│?? ├── items.py ????│?? ├── middlewares.py ????│?? ├── pipelines.py ????│?? ├── settings.py ????│?? └── spiders ????│?????? └── __init__.py ????└── scrapy.cfg

大多數默認情況下產生的這些文件實際上不會被用到,它們只是建議以一種合理的方式來構建我們的代碼。從現在開始,你應該把?~/scrapers/zipru/zipru_scraper?當做這個項目的根目錄。這里是任何scrapy命令運行的目錄,同時也是所有相對路徑的根。

添加一個基本的爬蟲功能

現在我們需要添加一個Spieder類來讓我們的scrapy真正地做一些事情。Spider類是scrapy爬蟲用來解析文本,爬取新的url鏈接或是提取數據的一個類。我們非常依賴于默認Spider類的實現,以最大限度地減少我們必須要編寫的代碼量。這里要做的事情看起來有點自動化,但假如你看過文檔,事情會變得更加簡單。

首先,在zipru_scraper/spiders/目錄下創建一個文件,命名為?zipru_spider.py?,輸入下面內容。

Python
1 2 3 4 5 import scrapy class ZipruSpider(scrapy.Spider): ????name = 'zipru' ????start_urls = ['http://zipru.to/torrents.php?category=TV']

你可以在上面的網頁中看到許多指向其他頁面的連接。我們想讓我們的爬蟲跟蹤這些鏈接,并且解析他們的內容。為了完成這個任務,我們首先需要識別出這些鏈接并且弄清楚他們指向的位置。

在這個階段,DOM檢查器將起到很大的助力。如果你右擊其中的一個頁面鏈接,在DOM檢查器里面查看它,然后你就會看到指向其他頁面的鏈接看起來像是這樣的:

1 2 3 <a href="/torrents.php?...page=2" title="page 2">2</a> <a href="/torrents.php?...page=3" title="page 3">3</a> <a href="/torrents.php?...page=4" title="page 4">4</a>

接下來我們需要為這些鏈接構造一個選擇器表達式。有幾種類型似乎用css或者xpath選擇器進行搜索更適合,所以我通常傾向于靈活地混合使用這幾種選擇器。我強烈推薦學習xpath,但是不幸的是,它有點超出了本教程的范圍。我個人認為xpath對于網絡爬蟲,web UI 測試,甚至一般的web開發來說都是不可或缺的。我接下來仍然會使用css選擇器,因為它對于大多數人來說可能比較熟悉。

要選擇這些頁面鏈接,我們可以把?a[title ~= page]?作為一個 css 選擇器,來查找標題中有 “page” 字符的?<a>標簽。如果你在 DOM 檢查器中按?ctrl-f,那么你就會發現你也可以使用這個css表達式作為一條查找語句(也可以使用xpath)。這樣我們就可以循環查看所有的匹配項了。這是一個很棒的方法,可以用來檢查一個表達式是否有效,并且表達式足夠明確不會在不小心中匹配到其他的標簽。我們的頁面鏈接選擇器同時滿足了這兩個條件。

為了講解我們的爬蟲是怎樣發現其他頁面的,我們在?ZipruSpider?類中添加一個?parse(response)?方法,就像下面這樣:

Python
1 2 3 4 5 def parse(self, response): ????????# proceed to other pages of the listings ????????for page_url in response.css('a[title ~= page]::attr(href)').extract(): ????????????page_url = response.urljoin(page_url) ????????????yield scrapy.Request(url=page_url, callback=self.parse)

當我們開始爬取的時候,我們添加到?start_urls?中的鏈接將會被自動獲取到,響應內容會被傳遞到?parse(response)?方法中。之后我們的代碼就會找到所有指向其他頁面的鏈接,并且產生新的請求對象,這些請求對象將使用同一個?parse(response)?作為回調函數。這些請求將被轉化成響應對象,只要 url 仍然產生,響應就會持續地返回到?parse(response)函數(感謝去重器)。

我們的爬蟲已經可以找到了頁面中列出的所有不同的頁面,并且對它們發出了請求,但我們仍然需要提取一些對爬蟲來說有用的數據。torrent 列表位于?<table>?標簽之內,并且有屬性?class="list2at"?,每個單獨的 torrent 都位于帶有屬性?class="lista2"?的?<tr>?標簽,其中的每一行都包含 8 個?<td>標簽,分別與 “類別”,“文件”,“添加時間”,“文件大小”,“保種的人”,“下載文件的人”,“文件描述”,和“上傳者”相對應。在代碼中查看其它的細節可能是最簡單的方法,下面是我們修改后的?parse(response)?方法:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def parse(self, response): ????????# proceed to other pages of the listings ????????for page_url in response.xpath('//a[contains(@title, "page ")]/@href').extract(): ????????????page_url = response.urljoin(page_url) ????????????yield scrapy.Request(url=page_url, callback=self.parse) ????????# extract the torrent items ????????for tr in response.css('table.lista2t tr.lista2'): ????????????tds = tr.css('td') ????????????link = tds[1].css('a')[0] ????????????yield { ????????????????'title' : link.css('::attr(title)').extract_first(), ????????????????'url' : response.urljoin(link.css('::attr(href)').extract_first()), ????????????????'date' : tds[2].css('::text').extract_first(), ????????????????'size' : tds[3].css('::text').extract_first(), ????????????????'seeders': int(tds[4].css('::text').extract_first()), ????????????????'leechers': int(tds[5].css('::text').extract_first()), ????????????????'uploader': tds[7].css('::text').extract_first(), ????????????}

我們的?parse(response)?方法現在能夠返回字典類型的數據,并且根據它們的類型自動區分請求。每個字典都會被解釋為一項,并且作為爬蟲數據輸出的一部分。

如果我們只是爬取大多數常見的網站,那我們已經完成了。我們只需要使用下面的命令來運行:

Python
1 scrapy crawl zipru -o torrents.jl

幾分鐘之后我們本應該得到一個 [JSON Lines] 格式?torrents.jl?文件,里面有我們所有的torrent 數據。取而代之的是我們得到下面的錯誤信息(和一大堆其他的東西):

Python
1 2 3 4 5 6 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 [scrapy.core.engine] DEBUG: Crawled (403) <GET http://zipru.to/robots.txt> (referer: None) ['partial'] [scrapy.core.engine] DEBUG: Crawled (403) <GET http://zipru.to/torrents.php?category=TV> (referer: None) ['partial'] [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 http://zipru.to/torrents.php?category=TV>: HTTP status code is not handled or not allowed [scrapy.core.engine] INFO: Closing spider (finished)

我好氣啊!我們現在必須變得更聰明來獲得我們完全可以從公共API得到的數據,因為上面的代碼永遠都無法爬取到那些數據。

簡單的問題

我們的第一個請求返回了一個?403?響應,所以這個url被爬蟲忽略掉了,然后一切都關閉了,因為我們只給爬蟲提供了一個 url 鏈接。同樣的請求在網頁瀏覽器里運行正常,即使是在沒有會話(session)歷史的隱匿模式也可以,所以這一定是由于兩者請求頭信息的差異造成的。我們可以使用?tcpdump?來比較這兩個請求的頭信息,但其實有個常見錯誤,所以我們應該首先檢查: user agent 。

Scrapy 默認把 user-agent 設置為 “Scrapy/1.3.3?(+http://scrapy.org)“,一些服務器可能會屏蔽這樣的請求,甚至使用白名單只允許少量的user agent 通過。你可以在線查看?最常見的 user agent?,使用其中任何一個通常就足以繞過基本反爬蟲策略。選擇一個你最喜歡的 User-agent ,然后打開?zipru_scraper/settings.py?,替換 User agent

Python
1 2 # Crawl responsibly by identifying yourself (and your website) on the user-agent #USER_AGENT = 'zipru_scraper (+http://www.yourdomain.com)'

使用下面內容替換 USER_AGENT :

Python
1 USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'

你可能注意到了,默認的scrapy設置中有一些令爬蟲蒙羞的事。關于這個問題的觀點眾說紛紜,但是我個人認為假如你想讓爬蟲表現的像是一個人在使用普通的網頁瀏覽器,那么你就應該把你的爬蟲設置地像普通的網絡瀏覽器那樣。所以讓我們一起添加下面的設置來降低一下爬蟲響應速度:

Python
1 2 CONCURRENT_REQUESTS = 1 DOWNLOAD_DELAY = 5

通過?AutoThrottle 擴展?,上面的設置會創建一個稍微真實一點的瀏覽模式。我們的爬蟲在默認情況下會遵守?robots.txt,所以現在我們的行為非常檢點。

現在使用?scrapy crawl zipru -o torrents.jl?命令再次運行爬蟲,應該會產生下面的輸出:

Python
1 2 3 4 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://zipru.to/robots.txt> (referer: None) [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET http://zipru.to/threat_defense.php?defense=1&r=78213556> from <GET http://zipru.to/torrents.php?category=TV> [scrapy.core.engine] DEBUG: Crawled (200) <GET http://zipru.to/threat_defense.php?defense=1&r=78213556> (referer: None) ['partial'] [scrapy.core.engine] INFO: Closing spider (finished)

這是一個巨大的進步!我們獲得了兩個?200?狀態碼和一個?302狀態碼,下載中間件知道如何處理?302?狀態碼。不幸的是,這個?302?將我們的請求重定向到了一個看起來不太吉利的頁面?threat_defense.php。不出所料,爬蟲沒有發現任何有用的東西,然后爬蟲就停止運行了。

注: 假如網站檢測到你的爬蟲,那么網站就會把你的請求重定向到 threat_defense.php 頁面,使你的爬蟲失效,用來防止頻繁的爬蟲請求影響了網站正常用戶的使用。

下載中間件

在我們深入研究我們目前所面臨的更復雜的問題之前,先了解一下請求和響應在爬蟲中是怎樣被處理的,將會很有幫助。當我們創建了我們基本的爬蟲,我們生成了一個?scrapy.Request?對象,然后這些請求會以某種方法轉化為與服務器的響應相對應的?scrapy.Response對象。這里的 “某種方法” 很大一部分是來自于下載中間件。

下載中間件繼承自?scrapy.downloadermiddlewares.DownloaderMiddleware?類并且實現了?process_request(request, spider)?和?process_response(request, response, spider)?方法。你大概可以從他們的名字中猜到他們是做什么的。實際上這里有一大堆的默認開啟的中間件。下面是標準的中間件配置(你當然可以禁用、添加或是重新設置這些選項):

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 DOWNLOADER_MIDDLEWARES_BASE = { ????'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, }

當一個請求到達服務器時,他們會通過每個這些中間件的?process_request(request, spider)?方法。 這是按照數字順序發生的,RobotsTxtMiddleware?中間件首先產生請求,并且?HttpCacheMiddleware?中間件最后產生請求。一旦接收到一個響應,它就會通過任何已啟用的中間件的?process_response(request,response,spider)?方法來返回響應。這次是以相反的順序發生的,所以數字越高越先發送到服務器,數字越低越先被爬蟲獲取到。

一個特別簡單的中間件是?CookiesMiddleware。它簡單地檢查響應中請求頭的?Set-Cookie,并且保存 cookie 。然后當響應返回的時候,他們會適當地設置?Cookie?請求頭標記,這樣這些標記就會被包含在發出的請求中了。這個由于時間太久的原因要比我們說的要稍微復雜些,但你會明白的。

另一個相對基本的就是?RedirectMiddleware?中間件,它是用來處理?3XX?重定向的。它讓一切不是?3XX?狀態碼的響應都能夠成功的通過,但假如響應中還有重定向發生會怎樣? 唯一能夠弄清楚服務器如何響應重定向URL的方法就是創建一個新的請求,而且這個中間件就是這么做的。當?process_response(request, response, spider)?方法返回一個請求對象而不是響應對象的時候,那么當前響應就會被丟棄,一切都會從新的請求開始。這就是?RedirectMiddleware?中間件怎樣處理重定向的,這個功能我們稍后會用到。

如果你對于有那么多的中間件默認是開啟的感到驚訝的話,那么你可能有興趣看看?體系架構概覽。實際上同時還有很多其他的事情在進行,但是,再說一次,scrapy的最大優點之一就是你不需要知道它的大部分原理。你甚至不需要知道下載中間件的存在,卻能寫一個實用的爬蟲,你不必知道其他部分就可以寫一個實用的下載中間件。

困難的問題

回到我們的爬蟲上來,我們發現我們被重定向到某個?threat_defense.php?defense=1&...?URL上,而不是我們要找的頁面。當我們在瀏覽器里面訪問這個頁面的時候,我們看到下面的東西停留了幾秒:

在被重定向到?threat_defense.php?defense=2&...?頁面之前,會出現像下面的提示:

看看第一個頁面的源代碼就會發現,有一些 javascript 代碼負責構造一個特殊的重定向URL,并且構造瀏覽器的cookies。如果我們想要完成這個任務,那我們就必須同時解決上面這兩個問題。

接下來,當然我們也需要解決驗證碼并提交答案。如果我們碰巧弄錯了,那么我們有時會被重定向到另一個驗證碼頁面,或者我們會在類似于下面的頁面上結束訪問:

在上面的頁面中,我們需要點擊 “Click here” 鏈接來開始整個重定向的循環,小菜一碟,對吧?

我們所有的問題都源于最開始的?302?重定向,因此處理它們的方法自然而然應該是做一個自定義的?重定向中間件。我們想讓我們的中間件在所有情況下都像是正常重定向中間件一樣,除非有一個?302?狀態碼并且請求被重定向到?threat_defense.php?頁面。當它遇到特殊的?302?狀態碼時,我們希望它能夠繞過所有的防御機制,把訪問cookie添加到 session 會話中,最后重新請求原來的頁面。如果我們能夠做到這一點,那么我們的Spider類就不必知道這些事情,因為請求會全部成功。

打開?zipru_scraper/middlewares.py?文件,并且把內容替換成下面的代碼:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import os, tempfile, time, sys, logging logger = logging.getLogger(__name__) import dryscrape import pytesseract from PIL import Image from scrapy.downloadermiddlewares.redirect import RedirectMiddleware class ThreatDefenceRedirectMiddleware(RedirectMiddleware): ????def _redirect(self, redirected, request, spider, reason): ????????# act normally if this isn't a threat defense redirect ????????if not self.is_threat_defense_url(redirected.url): ????????????return super()._redirect(redirected, request, spider, reason) ????????logger.debug(f'Zipru threat defense triggered for {request.url}') ????????request.cookies = self.bypass_threat_defense(redirected.url) ????????request.dont_filter = True # prevents the original link being marked a dupe ????????return request ????def is_threat_defense_url(self, url): ????????return '://zipru.to/threat_defense.php' in url

你可能注意到我們繼承了?RedirectMiddleware?類,而不是直接繼承?DownloaderMiddleware?類。這樣就允許我們重用大部分的重定向處理函數,并且把我們的代碼插入到?_redirect(redirected, request, spider, reason)?函數中,一旦有重定向的請求被創建,process_response(request, response, spider)?函數就會調用這個函數。我們只是把對于普通的重定向的處理推遲到父類進行處理,但是對于特殊的威脅防御重定向的處理是不一樣的。我們到目前為止還沒有實現?bypass_threat_defense(url)?方法,但是我們可以知道它應該返回訪問cookies,并把它附加到原來的請求中,然后原來的請求將被重新處理。

為了開啟我們新的中間件,我們需要把下面的內容添加到?zipru_scraper/settings.py中:

Python
1 2 3 4 DOWNLOADER_MIDDLEWARES = { ????'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': None, ????'zipru_scraper.middlewares.ThreatDefenceRedirectMiddleware': 600, }

這會禁用默認的重定向中間件,并且把我們的中間件添加在中間件堆棧中和默認重定向中間件相同的位置。我們必須安裝一些額外的包,雖然我們現在沒有用到,但是稍后我們會導入它們:

Python
1 2 3 pip install dryscrape # headless webkit pip install Pillow # image processing pip install pytesseract # OCR

請注意,這三個包都有 pip 無法處理的外部依賴,如果你運行出錯,那么你可能需要訪問?dryscrape,?Pillow, 和?pytesseract?的安裝教程,遵循平臺的具體說明來解決。

我們的中間件現在應該能夠替代原來的標準重定向中間件,現在我們只需要實現?bypass_thread_defense(url)?方法。我們可以解析 javascript 代碼來得到我們需要的變量,然后用 python 重建邏輯,但這看起來很不牢靠,而且需要大量的工作。讓我們采用更簡單的方法,盡管可能還是比較笨重,使用無頭的 webkit 實例。有幾個不同選擇,但我個人比較喜歡?dryscrape?(我們已經在上面安裝了)

首先,讓我們在中間件構造函數中初始化一個 dryscrape 會話。

Python
1 2 3 4 5 6 7 8 def __init__(self, settings): ????????super().__init__(settings) ????????# start xvfb to support headless scraping ????????if 'linux' in sys.platform: ????????????dryscrape.start_xvfb() ????????self.dryscrape_session = dryscrape.Session(base_url='http://zipru.to')

你可以把這個會話對象當做是一個單獨的瀏覽器標簽頁,它可以完成一切瀏覽器通常可以做的事情(例如:獲取外部資源,執行腳本)。我們可以在新的標簽頁中打開新的 URL 鏈接,點擊一些東西,或者在輸入框中輸入內容,或是做其他的各種事情。Scrapy 支持并發請求和多項處理,但是響應的處理是單線程的。這意味著我們可以使用這個單獨的 dryscrapy 會話,而不必擔心線程安全。

現在讓我們實現繞過威脅防御機制的基本邏輯。

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def bypass_threat_defense(self, url=None): ????????# only navigate if any explicit url is provided ????????if url: ????????????self.dryscrape_session.visit(url) ????????# solve the captcha if there is one ????????captcha_images = self.dryscrape_session.css('img[src *= captcha]') ????????if len(captcha_images) > 0: ????????????return self.solve_captcha(captcha_images[0]) ????????# click on any explicit retry links ????????retry_links = self.dryscrape_session.css('a[href *= threat_defense]') ????????if len(retry_links) > 0: ????????????return self.bypass_threat_defense(retry_links[0].get_attr('href')) ????????# otherwise, we're on a redirect page so wait for the redirect and try again ????????self.wait_for_redirect() ????????return self.bypass_threat_defense() ????def wait_for_redirect(self, url = None, wait = 0.1, timeout=10): ????????url = url or self.dryscrape_session.url() ????????for i in range(int(timeout//wait)): ????????????time.sleep(wait) ????????????if self.dryscrape_session.url() != url: ????????????????return self.dryscrape_session.url() ????????logger.error(f'Maybe {self.dryscrape_session.url()} isn\'t a redirect URL?') ????????raise Exception('Timed out on the zipru redirect page.')

這樣就處理了我們在瀏覽器中遇到的所有不同的情況,并且完全符合人類在每種情況中的行為。在任何給定情況下采取的措施都取決于當前頁面的情況,所以這種方法可以稍微優雅一點地處理各種不同的情況。

最后一個難題是如果如何解決驗證碼。網上提供了?驗證碼識別?服務,你可以在必要時使用它的API,但是這次的這些驗證碼非常簡單,我們只用 OCR 就可以解決它。使用 pytessertact 的 OCR 功能,最后我們可以添加?solve_captcha(img)?函數,這樣就完善了?bypass_threat_defense()?函數。

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 def solve_captcha(self, img, width=1280, height=800): ????????# take a screenshot of the page ????????self.dryscrape_session.set_viewport_size(width, height) ????????filename = tempfile.mktemp('.png') ????????self.dryscrape_session.render(filename, width, height) ????????# inject javascript to find the bounds of the captcha ????????js = 'document.querySelector("img[src *= captcha]").getBoundingClientRect()' ????????rect = self.dryscrape_session.eval_script(js) ????????box = (int(rect['left']), int(rect['top']), int(rect['right']), int(rect['bottom'])) ????????# solve the captcha in the screenshot ????????image = Image.open(filename) ????????os.unlink(filename) ????????captcha_image = image.crop(box) ????????captcha = pytesseract.image_to_string(captcha_image) ????????logger.debug(f'Solved the Zipru captcha: "{captcha}"') ????????# submit the captcha ????????input = self.dryscrape_session.xpath('//input[@id = "solve_string"]')[0] ????????input.set(captcha) ????????button = self.dryscrape_session.xpath('//button[@id = "button_submit"]')[0] ????????url = self.dryscrape_session.url() ????????button.click() ????????# try again if it we redirect to a threat defense URL ????????if self.is_threat_defense_url(self.wait_for_redirect(url)): ????????????return self.bypass_threat_defense() ????????# otherwise return the cookies as a dict ????????cookies = {} ????????for cookie_string in self.dryscrape_session.cookies(): ????????????if 'domain=zipru.to' in cookie_string: ????????????????key, value = cookie_string.split(';')[0].split('=') ????????????????cookies[key] = value ????????return cookies

你可能注意到如果驗證碼因為某些原因識別失敗的話,它就會委托給?back to the bypass_threat_defense()?函數。這樣就給了我們多次識別驗證碼的機會,但重點是,我們會在得到正確結果之前一直在驗證碼識別過程中循環。

這應該足夠讓我們的爬蟲工作,但是它有可能陷入死循環中。

Python
1 2 3 4 5 6 7 8 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://zipru.to/robots.txt> (referer: None) [zipru_scraper.middlewares] DEBUG: Zipru threat defense triggered for http://zipru.to/torrents.php?category=TV [zipru_scraper.middlewares] DEBUG: Solved the Zipru captcha: "UJM39" [zipru_scraper.middlewares] DEBUG: Zipru threat defense triggered for http://zipru.to/torrents.php?category=TV [zipru_scraper.middlewares] DEBUG: Solved the Zipru captcha: "TQ9OG" [zipru_scraper.middlewares] DEBUG: Zipru threat defense triggered for http://zipru.to/torrents.php?category=TV [zipru_scraper.middlewares] DEBUG: Solved the Zipru captcha: "KH9A8" ...

至少看起來我們的中間件已經成功地解決了驗證碼,然后補發了請求。問題在于,新的請求再次觸發了威脅防御機制。我第一個想法是我可能在怎樣解析或是添加cookie上面有錯誤,但是我檢查了三次,代碼是正確的。這是另外一種情況 “唯一可能不同的事情就是請求頭” 。

很明顯,scrapy 和 dryscrape 的請求頭都繞過了最初的觸發?403?響應的過濾器,因為我們現在不會得到任何?403?的響應。這肯定是因為它們的請求頭信息不一致導致的。我的猜測是其中一個加密的訪問cookies包含了整個請求頭信息的散列值,如果這個散列不匹配,就會觸發威脅防御機制。這樣的目的可能是防止有人把瀏覽器的cookie復制到爬蟲中去,但是它只是增加了你需要解決的問題而已。

所以讓我們在?zipru_scraper/settings.py?中把請求頭信息修改成下面這個樣子。

Python
1 2 3 4 5 6 7 DEFAULT_REQUEST_HEADERS = { ????'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', ????'User-Agent': USER_AGENT, ????'Connection': 'Keep-Alive', ????'Accept-Encoding': 'gzip, deflate', ????'Accept-Language': 'en-US,*', }

注意我們已經把?User-Agent?頭信息修改成了我們之前定義的?USER_AGENT?中去.這個工作是由 user agent 中間件自動添加進去的,但是把所有的這些配置放到一個地方可以使得 dryscrape 更容易復制請求頭信息。我們可以通過修改?ThreatDefenceRedirectMiddleware?初始化函數像下面這樣:

Python
1 2 3 4 5 6 7 8 9 10 11 12 def __init__(self, settings): ????super().__init__(settings) ????# start xvfb to support headless scraping ????if 'linux' in sys.platform: ????????dryscrape.start_xvfb() ????self.dryscrape_session = dryscrape.Session(base_url='http://zipru.to') ????for key, value in settings['DEFAULT_REQUEST_HEADERS'].items(): ????????# seems to be a bug with how webkit-server handles accept-encoding ????????if key.lower() != 'accept-encoding': ????????????self.dryscrape_session.set_header(key, value)

現在,當我們可以通過命令?scrapy crawl zipru -o torrents.jl?再次運行爬蟲。我們可以看到源源不斷的爬取的內容,并且我們的?torrents.jl?文件記錄把爬取的內容全部記錄了下來。我們已經成功地繞過了所有的威脅防御機制。

總結

我們已經成功地寫了一個能夠解決四種截然不同的威脅防御機制的爬蟲,這四種防御機制分別是:

  • User agent 過濾
  • 模糊的 Javascript 重定向
  • 驗證碼
  • 請求頭一致性檢查
  • 我們的目標網站 Zipru 可能是虛構的,但是這些機制都是你會在真實網站上遇到的真實的反爬蟲技術。希望我們使用的方法對你自己爬蟲中遇到的挑戰有幫助。

    轉載于:https://www.cnblogs.com/paisenpython/p/10303509.html

    總結

    以上是生活随笔為你收集整理的爬虫进阶:反反爬虫技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    最新成人在线 | 欧美精品免费视频 | 一区二区理论片 | 在线观看免费福利 | 狠狠干天天射 | 91精品国产91p65 | 丁香综合五月 | 亚洲闷骚少妇在线观看网站 | 亚洲国产欧美一区二区三区丁香婷 | 97超碰资源总站 | 日韩影视大全 | 国产精品9999 | 久久午夜视频 | 午夜 在线 | 91自拍成人 | 免费福利片2019潦草影视午夜 | 超碰九九 | 日韩h在线观看 | 99精品在线视频观看 | 久久久精品成人 | 日韩视频免费观看高清 | 91丨九色丨蝌蚪丨老版 | 久久精品99久久久久久 | 99国产一区二区三精品乱码 | 91在线视频免费91 | 韩国av永久免费 | 国产精品乱码久久久久久1区2区 | 久久精品国产第一区二区三区 | 四虎影院在线观看av | 亚洲人成在线电影 | 国产精品综合在线 | 国产精品网红直播 | 欧美精品一二三 | 欧美性视频网站 | 国产黄色精品网站 | 久久av一区二区三区亚洲 | 免费特级黄色片 | 国产精品1区2区3区 久久免费视频7 | 天天爽人人爽夜夜爽 | 黄色毛片大全 | 91成人精品一区在线播放 | 国产69精品久久久久99尤 | 久久精品三 | 一区二区 不卡 | 亚洲第一区精品 | 国产91精品欧美 | 中文字幕韩在线第一页 | 国产va饥渴难耐女保洁员在线观看 | 手机看片福利 | 中文字幕在线视频精品 | 亚洲最大在线视频 | 国产免费观看高清完整版 | 免费色视频网站 | 欧美成年人在线观看 | 伊人久在线| 久久99国产精品久久99 | 免费大片av | 日本资源中文字幕在线 | 国产精品99久久久久久人免费 | 日韩首页| 欧美aa一级 | 又爽又黄在线观看 | 久久国产一区二区 | 日日干天天操 | 欧美日韩一区二区免费在线观看 | 亚洲国产精品一区二区尤物区 | 久爱精品在线 | 久久久精品 | 天天操天天色天天 | 一区二区视频电影在线观看 | 在线观看黄网站 | 亚洲日本韩国一区二区 | 人人插人人爱 | 夜夜躁日日躁 | 91看毛片| 成人一级免费电影 | 五月婷婷一区 | 国产91九色蝌蚪 | 视频一区二区视频 | 久综合网 | 欧美伦理电影一区二区 | 在线草 | 国产乱对白刺激视频在线观看女王 | 成人黄色片免费 | 久久综合久久综合这里只有精品 | 日韩午夜小视频 | 国产精品第 | 成人av一区二区在线观看 | 日韩成人精品一区二区三区 | 久久久精品一区二区 | 亚洲成人av在线播放 | 丁香六月婷婷开心婷婷网 | 亚洲欧美国产精品18p | 99久久久久久久久久 | 五月婷婷开心中文字幕 | 国产在线精品国自产拍影院 | 免费一级日韩欧美性大片 | 免费观看久久久 | 成人黄色电影免费观看 | 日本三级中文字幕在线观看 | 夜夜操综合网 | 日韩精品在线免费播放 | 中文字幕中文字幕中文字幕 | 日韩av专区| 亚洲视频一级 | 西西44人体做爰大胆视频 | 中文字幕人成不卡一区 | 99精品乱码国产在线观看 | 成人av在线直播 | 免费三级a | 日韩专区 在线 | 91传媒在线播放 | 97在线观看免费高清 | 日本久久精品 | 欧美日韩在线播放一区 | 国内成人精品2018免费看 | 在线观看岛国av | 久久少妇免费视频 | 国产激情久久久 | 国产欧美在线一区 | 精品在线观看视频 | av免费试看 | 精品免费视频123区 午夜久久成人 | 岛国一区在线 | japanesexxxhd奶水| 最新91在线视频 | 色综合久久久久综合 | 又黄又刺激 | 激情综合啪啪 | 国产色拍 | 国产一区二区观看 | 亚洲视频1区2区 | 日韩 精品 一区 国产 麻豆 | 黄色在线免费观看网站 | 久久精品视频在线播放 | 五月天久久婷 | 在线黄色免费av | 国产一区二区免费在线观看 | 狠狠的干 | 国内精品久久久久久久97牛牛 | 九色精品免费永久在线 | 日韩一区二区三区免费视频 | 久久视频国产精品免费视频在线 | 中文字幕视频网 | 国产黄色大全 | 一本一本久久a久久精品综合小说 | 亚洲狠狠婷婷 | 在线观看国产日韩 | 在线观看电影av | 激情中文在线 | 天天夜操| 在线观看午夜av | 精品国产一区二区三区久久久蜜臀 | 亚洲成人资源网 | 久久久久久久久毛片 | 国产九九九九九 | 国产麻豆精品传媒av国产下载 | 九九视频在线 | 91精品啪在线观看国产线免费 | 久草视频免费观 | 国产玖玖视频 | av千婊在线免费观看 | 精品视频www| 免费看污污视频的网站 | 9ⅰ精品久久久久久久久中文字幕 | 国产精品久久久久一区二区三区 | 成人欧美一区二区三区黑人麻豆 | 日韩久久精品一区二区 | 久草色在线观看 | 久久久久久久久久久网站 | 日本巨乳在线 | 91丨九色丨国产在线观看 | 国产成人在线看 | 在线a视频免费观看 | 日本乱视频 | 中文字幕在线播放第一页 | 国产中文字幕在线视频 | 国产xxxx性hd极品 | 国产精品久久99综合免费观看尤物 | 天天色天天综合 | 福利视频一区二区 | 中文字幕九九 | 亚洲国产免费看 | 999国内精品永久免费视频 | 500部大龄熟乱视频 欧美日本三级 | 三级在线播放视频 | av中文字幕av| 久久亚洲视频 | 午夜12点 | 精品黄色在线 | 国产亚洲欧美日韩高清 | 999久久久久 | 亚洲五月六月 | 国产一二区视频 | 久久久久久久久电影 | 91av中文| 久久综合国产伦精品免费 | 国产黄色片在线 | 久久免费视频一区 | 欧美日韩中文另类 | 免费a级大片 | 深爱婷婷 | 亚洲视频免费在线 | 天天做综合网 | 欧美与欧洲交xxxx免费观看 | 国产精品大片 | av3级在线| 九九有精品 | 国产高清在线免费观看 | 国产成人在线观看免费 | 色多视频在线观看 | 亚洲成a人片77777kkkk1在线观看 | 福利一区在线 | 国产亚洲精品久久久久久久久久久久 | 在线只有精品 | 久久午夜电影院 | 天天操人 | 欧美地下肉体性派对 | 亚洲区另类春色综合小说校园片 | 超碰97中文| 亚洲毛片在线观看. | 国产精品剧情 | 免费三级a | 97视频资源 | 综合网久久 | 久久久久在线视频 | 337p西西人体大胆瓣开下部 | 丝袜+亚洲+另类+欧美+变态 | 在线观看中文字幕一区 | 久草在线这里只有精品 | 国模精品一区二区三区 | 麻豆观看| 久草在线免费看视频 | 国产精品欧美一区二区 | 欧美性另类 | 美女网站在线看 | 欧美高清视频不卡网 | 91在线日本 | 99超碰在线播放 | 日韩在线免费视频观看 | 久久99久久99精品免观看粉嫩 | 日韩av免费观看网站 | 在线一区电影 | 国产精品中文久久久久久久 | 精品国产乱子伦一区二区 | 精品国产1区2区3区 国产欧美精品在线观看 | 特级西西444www大精品视频免费看 | 亚洲欧美婷婷六月色综合 | 亚洲最新av在线网址 | 国产在线a视频 | 四虎影视精品成人 | 手机看片中文字幕 | 麻豆一区在线观看 | 国产资源免费在线观看 | 视频99爱 | 天天爽夜夜爽人人爽一区二区 | 992tv在线成人免费观看 | 久日视频 | 国产乱对白刺激视频在线观看女王 | 日韩免费小视频 | 久久久久久久久久久综合 | 欧美精品久久久久久久久久久 | 在线免费日韩 | 六月婷婷色 | 波多野结衣小视频 | 韩日成人av | 免费av 在线 | 色在线网 | 日日射av | 国产成人三级在线观看 | 国产精品自产拍 | 麻豆视频在线免费 | 午夜精品视频在线 | 婷婷九九| 欧美在线资源 | 色播六月天 | 欧美日韩观看 | 日日干 天天干 | 国产中文a | 精品99在线 | 69国产精品视频 | 国产精品 欧美 日韩 | 波多野结衣电影一区 | 五月激情丁香婷婷 | 亚州国产视频 | 久久精品这里都是精品 | 亚洲国产一区在线观看 | 999久久久久久久久久久 | 99精品国产一区二区三区麻豆 | 国产福利一区二区在线 | 国产精品理论在线观看 | 激情婷婷六月 | 成人黄色在线 | 欧美精品在线一区 | 日本在线观看一区二区三区 | 天天干,天天射,天天操,天天摸 | 免费福利片2019潦草影视午夜 | 欧美成人精品在线 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 国产成人精品一区二区三区福利 | 麻豆 91 在线 | 国产精品伦一区二区三区视频 | 久免费视频 | 日韩在线观看第一页 | 高潮毛片无遮挡高清免费 | 欧美日韩国产色综合一二三四 | 午夜精品一区二区国产 | 亚洲黄色成人网 | 99久久精品国产一区 | 国产黄在线观看 | 国产成人精品亚洲 | 国产中文字幕精品 | 欧美日本国产在线观看 | 免费日韩一区二区三区 | 精品99在线观看 | 国产精品高清免费在线观看 | av在线永久免费观看 | 国产精品不卡在线 | 欧美色精品天天在线观看视频 | 亚洲精品永久免费视频 | 日韩在线观看视频一区二区三区 | 在线观看aaa | 久久久久免费视频 | 欧美日韩综合在线 | 亚洲美女在线国产 | 国产午夜精品一区二区三区欧美 | 成人h视频在线播放 | 天天综合视频在线观看 | 国产一区二区三区四区在线 | a级成人毛片| 亚洲天天综合网 | av观看久久久 | 国产又粗又猛又黄视频 | 精品久久精品 | 国内精品福利视频 | 丰满少妇在线观看网站 | 国产一区二区视频在线 | 久久精品国产精品亚洲 | 中文av资源站 | www.激情五月.com | 国产精品久久网 | 久久久久在线观看 | 激情六月婷婷久久 | 国产精品女 | 精品国内自产拍在线观看视频 | 激情丁香月 | 黄色软件视频大全免费下载 | 国产精品一区二区无线 | 精品亚洲一区二区三区 | 久久综合99| av片一区二区 | 国产精品自产拍在线观看 | 久久综合色综合88 | 麻豆精品视频在线 | 久久午夜羞羞影院 | 狠狠干在线 | 麻豆传媒在线免费看 | 精品国产福利在线 | av久久久久久 | 999国内精品永久免费视频 | 国产精品视频久久 | 午夜精品一区二区国产 | 最近中文字幕免费大全 | 国产破处精品 | 伊人婷婷综合 | 最近乱久中文字幕 | 国产一区二区高清视频 | 九九有精品 | 久久九九视频 | 国产一区二区在线免费视频 | 久久精品艹 | 一级免费看 | 二区三区视频 | 四虎影视精品成人 | 欧美婷婷综合 | 国产精品大片在线观看 | 一级黄色片在线免费看 | 亚洲精品综合在线观看 | 在线观看免费色 | 在线观看岛国 | 最新高清无码专区 | 国内精品久久久久影院一蜜桃 | 深爱激情五月婷婷 | 国产日韩精品一区二区三区 | 麻花传媒mv免费观看 | 亚洲国产精品一区二区尤物区 | 中文字幕在线观看播放 | 久久国产网站 | 99在线精品免费视频九九视 | 99久久er热在这里只有精品66 | 欧美色操 | 91探花在线 | 午夜影视一区 | 色综合天天狠天天透天天伊人 | 中文字幕丝袜一区二区 | 日狠狠| 日韩在线中文字幕 | 久久久国产高清 | 久久久精品欧美一区二区免费 | 国产又粗又长的视频 | 国产手机av | 亚洲精品五月天 | 久久久久久黄色 | 久久99精品国产 | 超碰在线观看av | 国产黄色在线看 | 亚洲天堂免费视频 | 国产婷婷精品 | 免费看一级 | 狠狠色噜噜狠狠狠狠2022 | 中文字幕乱在线伦视频中文字幕乱码在线 | 免费看毛片在线 | 国产视频999| 亚洲区另类春色综合小说 | av一级久久 | 中文字幕亚洲欧美日韩 | 欧美a性| 欧美综合在线视频 | 久久久久久久18 | 中文字幕精品一区二区三区电影 | 亚洲精品在线免费 | 免费av网址大全 | 久热色超碰 | 国产黄色免费看 | 精品久久久免费 | 99视频免费在线观看 | 国产精品国产三级在线专区 | 久久网址 | 日韩色爱 | 一区二区三区四区五区在线视频 | 亚洲韩国一区二区三区 | av电影av在线| 香蕉视频久久 | 欧美日韩国产一区二区在线观看 | 日本一区二区三区免费看 | 免费 在线 中文 日本 | 黄色小说免费观看 | 精品国产1区2区3区 国产欧美精品在线观看 | 婷婷在线播放 | 天天色天天爱天天射综合 | 人人澡超碰碰97碰碰碰软件 | 久久久精品综合 | 亚洲欧美va | 欧美男同视频网站 | 国产高清免费视频 | 国产成人久久av977小说 | 青青河边草免费视频 | 91在线观看视频网站 | 日韩三级一区 | 久热免费 | 欧美一级视频免费 | 国产精品久久久久久久婷婷 | 久久精品爱爱视频 | 国产精品www | 国产精品久久久久四虎 | 日韩欧美精选 | 国产69精品久久久久99 | 在线播放 日韩专区 | 免费在线观看中文字幕 | 久久久亚洲网站 | 99视频偷窥在线精品国自产拍 | 国产探花在线看 | 亚洲激情视频在线 | 香蕉免费在线 | 国产成人61精品免费看片 | 国产999久久久 | 国产在线观 | 日本久久片 | 欧美一级小视频 | 成人免费视频网站 | 国产极品尤物在线 | 精品国产乱码久久久久久天美 | 黄网站免费看 | 欧美精品免费视频 | 狠狠操在线 | 欧美性生爱 | 欧美日韩免费一区二区 | 国外成人在线视频网站 | 免费国产在线精品 | 日本午夜在线亚洲.国产 | 二区在线播放 | 国产精品久久亚洲 | 亚洲精品在线资源 | 成人精品一区二区三区中文字幕 | 成人a视频片观看免费 | 中文字幕一区二区三区四区 | 婷婷五月在线视频 | 中文字幕精品一区久久久久 | 国产视频日韩视频欧美视频 | 国产成人一区在线 | 国产男女免费完整视频 | 亚洲国产久 | 欧美在线不卡一区 | 9999毛片 | 国产拍揄自揄精品视频麻豆 | 国产精品美乳一区二区免费 | 成人av电影免费 | av网在线观看| 91av九色| 精品一区久久 | 婷婷丁香自拍 | 欧美视频xxx | 国产网站色 | 色老板在线视频 | 2021国产在线视频 | 在线观看免费av片 | 久久综合9988久久爱 | 在线看污网站 | 啪啪免费视频网站 | av免费在线播放 | 国产精品一区二区av麻豆 | 色a资源在线 | 亚洲精品国产精品国自产在线 | 亚一亚二国产专区 | 欧美日韩中字 | 2017狠狠干| 亚洲一区视频在线播放 | 亚洲一二三久久 | 五月天伊人 | 亚洲在线免费视频 | 91精品久| 国产午夜精品一区二区三区 | 人人艹视频 | 日韩欧美在线观看一区二区 | 久久国产精品二国产精品中国洋人 | www.天天射.com| 精品久久精品 | 91手机电视| 91视频在线自拍 | 午夜a区 | 国产手机视频在线播放 | 日日久视频 | 免费特级黄色片 | 日本公妇色中文字幕 | 麻豆系列在线观看 | 狠狠色丁香婷婷 | 在线看黄色的网站 | 一本大道久久精品懂色aⅴ 五月婷社区 | 日本精品久久久一区二区三区 | 中文字幕视频免费观看 | 久久久伊人网 | 成人午夜电影在线播放 | 欧美性黄网官网 | 日韩视频免费在线 | 欧美日韩一区二区三区不卡 | 在线观看免费av片 | 久久精品免费看 | 欧美性色黄大片在线观看 | 国产不卡在线看 | 亚洲欧美综合精品久久成人 | 中文字幕中文字幕 | 成人精品电影 | 国产免费黄视频在线观看 | 操操日| 丁香五月亚洲综合在线 | 亚洲精品国产日韩 | bbbbb女女女女女bbbbb国产 | 久精品视频 | 久久久久久久久久久久电影 | 欧美a√大片 | 草久视频在线 | 香蕉在线视频观看 | 欧美一级日韩三级 | 久久国产欧美日韩精品 | 黄色小网站在线观看 | 久久1区| 久久国产热视频 | 久久久久久久久久久综合 | 国产亚洲视频在线观看 | 日韩欧美一区二区三区免费观看 | 日本韩国中文字幕 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产成人精品一区二区三区福利 | 99精品福利| 久久av影院| 91最新地址永久入口 | 亚洲精品国产精品国自产在线 | 99久久99久久精品国产片果冰 | 亚洲国产中文在线观看 | 美女国产在线 | 日韩欧美电影在线 | 9797在线看片亚洲精品 | 国产精品国产自产拍高清av | 97理论片 | 久在线观看视频 | 国产精品美女毛片真酒店 | 中文字幕高清有码 | 国产精品久久久久四虎 | 亚洲国产精品一区二区久久hs | 精品久久久久久久久久久久久久久久久久 | 国产麻豆视频在线观看 | 日韩欧美精品在线观看视频 | 国产一级免费观看 | sesese图片 | 亚洲精品小区久久久久久 | 香蕉视频在线免费看 | 97国产大学生情侣白嫩酒店 | 国产精品免费观看国产网曝瓜 | 色婷婷av国产精品 | 射射射av | www毛片com| 中文字幕视频一区二区 | 久草视频在 | 欧美亚洲一级片 | av成人免费观看 | 黄色三级网站在线观看 | 一级黄色片在线免费看 | 久久免费视频网 | 亚洲精品乱码久久久久久9色 | 在线一区电影 | 亚洲一区尤物 | 69av视频在线观看 | 国产精品 日本 | 毛片一级免费一级 | 天天操夜夜叫 | 手机在线中文字幕 | 日韩久久精品一区二区三区下载 | 丁香婷婷激情啪啪 | 一区二区在线电影 | 免费亚洲视频在线观看 | 香蕉久久久久久久 | 国产一二三在线视频 | 成人高清av在线 | 黄色中文字幕在线 | 丁香视频免费观看 | 国内精品国产三级国产aⅴ久 | 久久午夜电影 | 午夜视频免费在线观看 | 操操操日日日干干干 | 日韩理论在线观看 | 在线免费观看黄色av | 日韩激情视频在线 | 国产专区视频在线 | 国产午夜精品免费一区二区三区视频 | 久久久久高清 | 日本久久久久久久久 | 国产午夜精品免费一区二区三区视频 | 国产午夜在线观看视频 | 国产手机精品视频 | 成人在线观看资源 | 天堂av免费观看 | 天天爱天天操天天干 | 国产精品一区二区久久久 | 天堂av免费 | 久久99精品久久久久蜜臀 | 超碰97人 | 一区二区三区在线视频111 | 日韩性片 | 超碰公开在线观看 | 在线免费观看麻豆视频 | 国产一区久久久 | 天天操天天操天天操 | 五月天堂网 | 91精品国产高清自在线观看 | 国产亚洲欧洲 | 在线观看涩涩 | 五月婷婷综合在线视频 | 亚洲五月激情 | 在线观看完整版 | 国产中文字幕一区 | 欧美福利视频一区 | 亚洲成人精品久久 | 999精品网| 色www.| 国产精品丝袜久久久久久久不卡 | 欧美一进一出抽搐大尺度视频 | 欧美精品久久久久久久亚洲调教 | 99久久精品久久久久久清纯 | 五月婷婷激情综合网 | 亚洲精品在线国产 | 成人资源在线观看 | av成人资源| 91欧美日韩国产 | 国产精品免费麻豆入口 | 国产精品乱码久久 | 久久只精品99品免费久23小说 | 日韩a在线看| 欧美中文字幕久久 | 国产精品久久久久久久久费观看 | 精品国产一区二区三区av性色 | 免费视频a | 国产系列 在线观看 | 日韩精品黄 | 中文字幕乱码一区二区 | japanesexxx乱女另类| 97日日碰人人模人人澡分享吧 | 色偷偷网站视频 | 81精品国产乱码久久久久久 | 亚洲欧美国产日韩在线观看 | 久久视频免费观看 | 日本精品视频一区 | 中文av资源站 | 干av在线 | 粉嫩av一区二区三区四区在线观看 | 日韩久久午夜一级啪啪 | 欧美日韩三级在线观看 | 亚洲精品一区二区三区高潮 | 99视屏| 国产精品久久久久久久久毛片 | 探花视频在线观看 | 久久久精品 | 国产精品久久一卡二卡 | 国产精品一区在线播放 | 色婷婷www| 97人人模人人爽人人喊网 | 久久国产精品精品国产色婷婷 | 欧美亚洲久久 | 久草资源在线观看 | 国产99久久久久 | 伊人午夜| 日韩精品一区二区三区电影 | 黄色av成人在线观看 | 麻豆久久一区二区 | 综合色在线 | 色偷偷88欧美精品久久久 | 国产成人黄色 | 国产麻豆果冻传媒在线观看 | 黄色网大全 | 久久国精品 | 中文字幕免费观看视频 | 在线性视频日韩欧美 | 久久久久久久久久久电影 | 久久噜噜少妇网站 | 精品在线视频一区二区三区 | 综合在线观看 | a视频在线观看 | 狠狠操综合网 | 久久综合给合久久狠狠色 | 91av久久 | 有码视频在线观看 | 国产一区欧美二区 | 91爱在线| 亚洲精品午夜aaa久久久 | 免费在线观看一区二区三区 | 91精品国产九九九久久久亚洲 | 成人av资源 | 夜夜爽88888免费视频4848 | 视频在线一区二区三区 | 一区二区三区中文字幕在线 | 国产做aⅴ在线视频播放 | 亚洲免费资源 | 在线观看av免费观看 | 国产一级大片免费看 | 有码中文字幕在线观看 | 欧美日韩国产精品久久 | 久久久久久久久久久网 | 六月激情 | 在线观看国产永久免费视频 | 色综合天天狠狠 | 久久久久久久久久久影视 | 国产午夜精品一区二区三区在线观看 | 亚洲国产播放 | 日韩大陆欧美高清视频区 | 欧美最猛性xxxxx(亚洲精品) | 中文字幕在线观看1 | 天天射射天天 | 五月天婷婷在线视频 | 国产小视频在线 | 探花国产在线 | 久久久综合九色合综国产精品 | 中文字幕 成人 | 国产专区在线 | 日韩在线视频网站 | 干干夜夜 | 欧美黑人性猛交 | 免费看黄的视频 | 日日婷婷夜日日天干 | 欧美一区二区伦理片 | 999久久久久久久久6666 | 欧美日韩国产三级 | 97国产大学生情侣酒店的特点 | 国产福利午夜 | 国产裸体视频网站 | 午夜美女福利直播 | 日韩精品久久一区二区 | 成人av在线资源 | 久久久精品一区二区 | 国产3p视频 | 亚洲成人中文在线 | 91成人精品一区在线播放69 | 特级aaa毛片| 精品在线免费视频 | 17婷婷久久www| 99 视频 高清 | 亚洲男人天堂a | 欧美淫视频 | 亚洲国产成人精品在线 | 国产精品久久久一区二区 | 91在线视频观看免费 | 在线播放日韩av | 人人精久 | 国产视频一级 | 久草在| 色九九影院 | 成人黄在线 | 香蕉在线观看 | 久久久久久国产精品999 | 久久久久北条麻妃免费看 | 婷婷久久国产 | 91夜夜夜 | 在线免费观看成人 | 国产又粗又猛又色 | 97国产小视频 | 国产a级片免费观看 | 波多野结衣电影久久 | 国产在线精品一区 | 成年人视频在线观看免费 | 精品久久久久久久久久国产 | 日本久久久久 | 啪啪激情网 | 69国产精品视频 | 日韩黄色免费在线观看 | 国产亲近乱来精品 | 亚洲国产精品第一区二区 | 午夜视频一区二区三区 | 久久久午夜精品理论片中文字幕 | 国产精品久久久久久久av电影 | 国内精品久久久精品电影院 | 欧美久久久久久久久 | 亚洲国产偷 | 日韩在线观看中文字幕 | 久操97| 国产精品一区二区视频 | 精品字幕在线 | 91亚洲精品久久久蜜桃 | 91超碰免费在线 | 成年人免费av | 国产在线视频一区二区三区 | 日本h视频在线观看 | 日韩精品不卡在线观看 | 国产午夜精品一区二区三区嫩草 | 午夜电影一区 | 中文有码在线视频 | 在线免费黄色片 | 黄色成年片 | 欧美精品一区二区性色 | 久久久久久国产精品999 | 九九有精品 | 天天躁天天躁天天躁婷 | 精品福利视频在线 | 国产精品96久久久久久吹潮 | 国产主播大尺度精品福利免费 | 激情小说久久 | 国产1级毛片 | 超碰国产在线播放 | 亚洲闷骚少妇在线观看网站 | 国产高清视频免费观看 | 黄色在线网站噜噜噜 | 日韩电影在线一区二区 | 亚洲男男gaygay无套 | 日韩专区中文字幕 | 97超碰人人爱 | 摸bbb搡bbb搡bbbb| 99热精品久久 | a√资源在线| 中文字幕日韩无 | 国产不卡在线观看视频 | 西西4444www大胆视频 | 国产精品成人在线观看 | 久久久国产毛片 | av一区二区三区在线播放 | 香蕉在线视频观看 | 久久精品高清视频 | 午夜精品福利一区二区 | 久久久久久久久久久电影 | 2019中文字幕第一页 | 日韩专区在线播放 | 激情综合啪 | 波多野结衣视频一区 | 国产在线视频资源 | 婷婷综合导航 | 国产成在线观看免费视频 | 国产亚洲成av人片在线观看桃 | 亚洲午夜小视频 | 99中文字幕在线观看 | 99久免费精品视频在线观看 | www.黄色小说.com | 在线观看黄色免费视频 | 97成人精品区在线播放 | 国内精品视频在线播放 | 亚洲涩涩网站 | 九九视频这里只有精品 | 精品一区二区在线看 | av视屏在线 | 亚洲a免费 | 日本精品在线视频 | 精品不卡视频 | 免费不卡中文字幕视频 | 久久免费高清视频 | 午夜精品久久久久久久99无限制 | 午夜美女福利直播 | 亚洲国产精品久久久久婷婷884 | 天天av天天| 久久小视频 | 国产成人黄色av | 91在线视频导航 | 狠狠躁18三区二区一区ai明星 | 日日夜日日干 | www.com.日本一级 | 亚洲高清av | 欧美国产高清 | 精品视频免费观看 | 伊人一级 | 欧美a级片免费看 | 欧美日韩国产综合一区二区 | 中文字幕最新精品 | 国产电影黄色av | 狠狠做深爱婷婷综合一区 | 国产精品一区二区无线 | 成人在线免费观看网站 | 色欧美日韩 | 日本三级久久 | 国产精品一区二区在线看 | 久久视频这里只有精品 | 日韩在线字幕 | av网站免费在线 | 91精选| 日本色小说视频 | 久久乐九色婷婷综合色狠狠182 | 免费手机黄色网址 | 黄色片网站 | 免费久久久久久久 | 久久99精品久久久久久久久久久久 | 精品日本视频 | 丁香六月婷婷开心婷婷网 | 欧美在线视频日韩 | 在线观看完整版 | 欧美精品一区二区在线观看 | 热久久国产 | 国产精品久久久久久久久蜜臀 | 久久公开视频 | 色七七亚洲影院 | 亚洲少妇自拍 | 日韩av影视在线观看 | 天天爽天天做 | 日本在线视频网址 | 日韩av中文在线观看 | 精品播放| 五月情婷婷 | 久久人91精品久久久久久不卡 | 在线精品观看 | 91精品国产网站 | 丁香午夜婷婷 | 亚洲精品玖玖玖av在线看 | 天天操天天干天天操天天干 | 欧美aaa一级 | 免费91麻豆精品国产自产在线观看 | 又色又爽又黄高潮的免费视频 | av中文在线观看 | 免费亚洲精品 | 精品一区二区视频 | 久久99精品一区二区三区三区 | 在线久草视频 | 欧美日韩中文在线观看 | 91精品国产乱码久久桃 | 精品国产一区二区三区av性色 | 中文字幕频道 | 99精品视频一区二区 | 日韩激情第一页 | 国产精品美女久久久久aⅴ 干干夜夜 | 亚洲最大成人免费网站 | 性色大片在线观看 | 500部大龄熟乱视频使用方法 | 中文字幕在线乱 | 国产99久久精品一区二区永久免费 | 国产又黄又爽无遮挡 | 国内精品久久久 | 日韩精品中文字幕在线观看 | 视频一区二区国产 | 久久久久久久久久久久久影院 | 丁香六月在线观看 | 国产成人精品综合久久久 | 国产不卡片 | 色久av | av成人免费在线 | 人人爱夜夜操 | 3d黄动漫免费看 | 91av免费看 | 日韩久久久久久久久久 | 99热播精品| 久久综合婷婷国产二区高清 | 亚洲最新av在线网站 | 国产精品永久久久久久久久久 | 人人射人人插 | 日韩毛片在线播放 | 日韩理论电影在线观看 | 国产一区二区三区免费视频 | 午夜av免费| 亚洲 中文 欧美 日韩vr 在线 | 国产精品久久嫩一区二区免费 | 国产亚洲精品美女久久 | 天天操天天操天天操天天操天天操 | 国产乱码精品一区二区三区介绍 | 日韩电影中文,亚洲精品乱码 | 久久黄色小说 | 日韩欧三级 | 久久国产剧场电影 | 欧美一区二区三区在线 |