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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

python爬虫入门 之 移动端数据的爬取

發(fā)布時間:2024/1/4 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 python爬虫入门 之 移动端数据的爬取 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第七章 移動端數(shù)據(jù)的爬取

基于某一款抓包工具 : fiddler ,青花瓷 ,miteproxy

7.1 fiddler 基本配置

7.1.1fiddler簡介和安裝

什么是Fiddler?

Fiddler是位于客戶端和服務(wù)器端的HTTP代理,也是目前最常用的http抓包工具之一 。 它能夠記錄客戶端和服務(wù)器之間的所有 HTTP請求,可以針對特定的HTTP請求,分析請求數(shù)據(jù)、設(shè)置斷點、調(diào)試web應(yīng)用、修改請求的數(shù)據(jù),甚至可以修改服務(wù)器返回的數(shù)據(jù),功能非常強(qiáng)大,是web調(diào)試的利器。

Fiddler安裝

Fiddler下載地址:https://www.telerik.com/fiddler

傻瓜式安裝,一鍵到底。Fiddler軟件界面如圖所示:

7.1.2手機(jī)APP抓包設(shè)置

Fiddler設(shè)置打開Fiddler軟件,打開工具的設(shè)置。(Fiddler軟件菜單欄:Tools->Options)在HTTPS中設(shè)置如下:

在Connections中設(shè)置如下

這里使用默認(rèn)8888端口,當(dāng)然也可以自己更改,但是注意不要與已經(jīng)使用的端口沖突:Allow remote computers to connect:允許別的機(jī)器把請求發(fā)送到fiddler上來

安全證書下載

在電腦瀏覽器中輸入地址:http://localhost:8888/,點擊FiddlerRoot certificate,下載安全證書:

安全證書安裝

證書是需要在手機(jī)上進(jìn)行安裝的,這樣在電腦Fiddler軟件抓包的時候,手機(jī)使用電腦的網(wǎng)卡上網(wǎng)才不會報錯。

Android手機(jī)安裝:

把證書放入手機(jī)的內(nèi)置或外置存儲卡上,然后通過手機(jī)的"系統(tǒng)安全-》從存儲設(shè)備安裝"菜單安裝證書。然后找到拷貝的FiddlerRoot.cer進(jìn)行安裝即可。安裝好之后,可以在信任的憑證中找到我們已經(jīng)安裝好的安全證書。

蘋果手機(jī)安裝:

保證手機(jī)網(wǎng)絡(luò)和fiddler所在機(jī)器網(wǎng)絡(luò)是同一個網(wǎng)段下的在safari中訪問http://fiddle機(jī)器ip:fiddler端口,進(jìn)行證書下載。然后進(jìn)行安裝證書操作。在手機(jī)中的設(shè)置-》通用-》關(guān)于本機(jī)-》證書信任設(shè)置-》開啟fiddler證書信任

局域網(wǎng)設(shè)置 想要使用Fiddler進(jìn)行手機(jī)抓包,首先要確保手機(jī)和電腦的網(wǎng)絡(luò)在一個內(nèi)網(wǎng)中,可以使用讓電腦和手機(jī)都連接同一個路由器。當(dāng)然,也可以讓電腦開放WIFI熱點,手機(jī)連入。這里,我使用的方法是,讓手機(jī)和電腦同時連入一個路由器中。最后,讓手機(jī)使用電腦的代理IP進(jìn)行上網(wǎng)。 在手機(jī)上,點擊連接的WIFI進(jìn)行網(wǎng)絡(luò)修改,添加代理。進(jìn)行手動設(shè)置,ip和端口號都是fiddler機(jī)器的ip和fiddler上設(shè)置的端口號。

Fiddler手機(jī)抓包測試

上述步驟都設(shè)置完成之后,用手機(jī)瀏覽器打開百度首頁,我們就可以順利抓包了

7.1.3移動端數(shù)據(jù)的捕獲流程

tools --> options --> connection -->allow remote

http: fiddler所在pc機(jī)的ip :8888/ 訪問到一張?zhí)峁┝俗C書下載功能的界面

fiddler所在機(jī)器和手機(jī)在同一網(wǎng)段下 :在手機(jī)上瀏覽器中訪問 http: fiddler所在pc機(jī)的ip :8888 獲取子頁面進(jìn)行證書的下載和安裝(證書信任的操作)

配置你手機(jī)的代理 :將手機(jī)的代理配置成 fiddler所對應(yīng)的pc機(jī)的ip和手機(jī)自己的端口

就可以讓fiddler捕獲手機(jī)發(fā)起的http和https的請求

7.2 scrapy ,pyspider

#總結(jié):
?
#爬蟲文件中的屬性和方法
    name :爬蟲文件唯一標(biāo)識
    start_url:該列表中的url會被自動的進(jìn)行請求發(fā)送
#自動請求發(fā)送的過程:
    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url,callback=self.parse)
?
#數(shù)據(jù)解析:
    scrapy中封裝的xpath進(jìn)行數(shù)據(jù)解析   
    
#scrapy中的xpath 和 etree中的xpath的區(qū)別
    scrapy的xpath進(jìn)行數(shù)據(jù)解析后返回的列表元素為Selector對象,extract或extract_first這兩個方法將Selector對象中對應(yīng)的數(shù)據(jù)取出

View Code

7.2.1Scrapy簡介

什么是框架?如何學(xué)習(xí)

框架就是一個集成各種功能且具有很強(qiáng)通用性(可以被應(yīng)用在各種不同的需求中)的一個項目模板

我們只需要學(xué)習(xí)框架中封裝好的相關(guān)功能即可

scrapy 集成的功能

高性能的數(shù)據(jù)解析操作 ,持久化存儲,高性能的數(shù)據(jù)下載操作......

環(huán)境的安裝(windows)

pip install wheel

下載twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/

進(jìn)入下載目錄,執(zhí)行 pip3 install Twisted?17.1.0?cp35?cp35m?win_amd64.whl

pip3 install pywin32

pip3 install scrapy

7.2.2 scrapy的基本使用

創(chuàng)建一個工程 :scrapy startproject firstBlood

項目結(jié)構(gòu):

project_name/
   scrapy.cfg:            #項目的主配置信息。(真正爬蟲相關(guān)的配置信息在settings.py文件中)
   project_name/
       __init__.py  
       items.py            #設(shè)置數(shù)據(jù)存儲模板,用于結(jié)構(gòu)化數(shù)據(jù),如:Django的Model
       pipelines.py        #數(shù)據(jù)持久化處理
       settings.py         #配置文件,如:遞歸的層數(shù)、并發(fā)數(shù),延遲下載等
       spiders/            #爬蟲目錄,如:創(chuàng)建文件,編寫爬蟲解析規(guī)則
           __init__.py

創(chuàng)建爬蟲應(yīng)用程序:(必須在spider這個目錄下創(chuàng)建一個爬蟲文件)

cd proName

scrapy genspider spiderName http://t.zoukankan.com/www.xx.com

編寫爬蟲文件:在步驟2執(zhí)行完畢后,會在項目的spiders中生成一個應(yīng)用名的py爬蟲文件

import scrapy

class FirstSpider(scrapy.Spider):
    #爬蟲文件的名稱:爬蟲文件的唯一標(biāo)識(在spiders子目錄下是可以創(chuàng)建多個爬蟲文件)
    name = 'first'
    #允許的域名
    # allowed_domains = ['www.baidu.com']
    #起始的url列表:列表中存放的url會被scrapy自動的進(jìn)行請求發(fā)送
    start_urls = ['https://www.baidu.com/','https://www.sogou.com/']
    #用作于數(shù)據(jù)解析:將start_urls列表中對應(yīng)的url請求成功后的響應(yīng)數(shù)據(jù)進(jìn)行解析
    def parse(self, response):
        print(response.text) #獲取字符串類型的響應(yīng)內(nèi)容
        print(response.body)#獲取字節(jié)類型的相應(yīng)內(nèi)容

View Code

設(shè)置修改settings.py配置文件相關(guān)配置

# settings.py 文件中
    #不遵從robots協(xié)議
    #進(jìn)行UA偽裝
    #進(jìn)行日志等級設(shè)定: LOG_LEVEL = False

View Code

setting.py中 ----- 基于終端指令的持久化存儲操作

BOT_NAME = 'firstBlood'

SPIDER_MODULES = ['firstBlood.spiders']
NEWSPIDER_MODULE = 'firstBlood.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'       #進(jìn)行ua偽裝
# Obey robots.txt rules
ROBOTSTXT_OBEY = False    #不遵從robotstx協(xié)議
LOG_LEVEL = 'ERROR'       #輸出錯誤類型的日志

View Code

setting.py ------------- 基于管道的持久化存儲

BOT_NAME = 'qiubaiPro'
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

SPIDER_MODULES = ['qiubaiPro.spiders']
NEWSPIDER_MODULE = 'qiubaiPro.spiders'


ITEM_PIPELINES = {
   'qiubaiPro.pipelines.QiubaiproPipeline': 300, #300表示的是優(yōu)先級(數(shù)值越小優(yōu)先級越大)
}

View Code

執(zhí)行爬蟲程序:scripy crawl spiderName

不輸出日志(錯誤信息會在日志中輸出,不要使用)

scripy crawl spiderName --nolog

View Code

7.2.3scrapy框架持久化存儲

#持久化存儲
    #基于終端指令
        特性 : 只能將 parse 方法的返回值存儲到本地的磁盤文件中
        指令 : scripy crawl spiderName -o filepath
    #基于管道
        #實現(xiàn)流程
        1.數(shù)據(jù)解析
        2.在item類中定義相關(guān)屬性
        3.將解析的數(shù)據(jù)封裝到一個 item 對象中(item文件中對應(yīng)類的對象)
        4.向管道提交item
        5.在管道文件中的 process_item 方法中接收 item 進(jìn)行持久化存儲
        6.在配置文件中開啟管道
    
    #管道中需注意細(xì)節(jié):
        1.配置文件中開啟的管道是一個字典,字典中的鍵值表示的就是某一個管道
        2.在管道對應(yīng)的源文件中其實可以定義多個管道類,一種形式的持久化存儲
        3.在process_item方法中的 return item 表示的是提交給下一個即將被執(zhí)行的管道類
        4.爬蟲文件中yield item 只可以將item傳遞給第一個被執(zhí)行的(優(yōu)先級最高的)管道
    
    #將同一份數(shù)據(jù)持久化存儲到不同平臺中:
        #分析
        1.管道文件中的一個管道內(nèi)負(fù)責(zé)數(shù)據(jù)的一種形式的持久化存儲

setting.py中 ----- 基于終端指令的持久化存儲操作

BOT_NAME = 'firstBlood'

SPIDER_MODULES = ['firstBlood.spiders']
NEWSPIDER_MODULE = 'firstBlood.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'       #進(jìn)行ua偽裝
# Obey robots.txt rules
ROBOTSTXT_OBEY = False    #不遵從robotstx協(xié)議
LOG_LEVEL = 'ERROR'       #輸出錯誤類型的日志

View Code

setting.py ------------- 基于管道的持久化存儲

BOT_NAME = 'qiubaiPro'
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

SPIDER_MODULES = ['qiubaiPro.spiders']
NEWSPIDER_MODULE = 'qiubaiPro.spiders'


ITEM_PIPELINES = {
   'qiubaiPro.pipelines.QiubaiproPipeline': 300, #300表示的是優(yōu)先級(數(shù)值越小優(yōu)先級越大)
}

View Code

糗事百科

qiubai.py

import scrapy
from qiubaiPro.items import QiubaiproItem

class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    # allowed_domains = ['http://t.zoukankan.com/www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/text/']
    
    #基于終端指令的持久化存儲操作
    # def parse(self, response):
    #     div_list = response.xpath('//*[@id="content-left"]/div')
    #     all_data = []
    #     for div in div_list:
    #         #scrapy中的xpath返回的列表的列表元素一定是Selector對象,我們最終想要的解析的
    #         #數(shù)據(jù)一定是存儲在該對象中
    #         #extract()將Selector對象中data參數(shù)的值取出
    #         # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
    #         author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
    #         #列表直接調(diào)用extract表示的是將extract作用到每一個列表元素中
    #         content = div.xpath('./a[1]/div/span//text()').extract()
    #         content = ''.join(content)
    #         dic = {
    #             'author':author,
    #             'content':content
    #         }
    #         all_data.append(dic)
    #     return all_data
    
   
    #基于管道的持久化存儲
    def parse(self, response):
        div_list = response.xpath('//*[@id="content-left"]/div')
        all_data = []
        for div in div_list:
            #scrapy中的xpath返回的列表的列表元素一定是Selector對象,我們最終想要的解析的
            #數(shù)據(jù)一定是存儲在該對象中
            #extract()將Selector對象中data參數(shù)的值取出
            # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
            #列表直接調(diào)用extract表示的是將extract作用到每一個列表元素中
            content = div.xpath('./a[1]/div/span//text()').extract()
            content = ''.join(content)

            #將解析的數(shù)據(jù)存儲到item對象
            item = QiubaiproItem()
            item['author'] = author
            item['content'] = content

            #將item提交給管道
            yield item #item一定是提交給了優(yōu)先級最高的管道類

View Code

itims.py

import scrapy

class QiubaiproItem(scrapy.Item):
    # define the fields for your item here like:
    author = scrapy.Field() #Field可以將其理解成是一個萬能的數(shù)據(jù)類型
    content = scrapy.Field()

View Code

pipelines.py 管道文件

import pymysql
from redis import Redis
class QiubaiproPipeline(object):
    fp = None
    def open_spider(self,spider):
        print('開始爬蟲......')
        self.fp = open('qiushibaike.txt','w',encoding='utf-8')

    #使用來接收爬蟲文件提交過來的item,然后將其進(jìn)行任意形式的持久化存儲
    #參數(shù)item:就是接收到的item對象
    #該方法每接收一個item就會調(diào)用一次
    def process_item(self, item, spider):
        author = item['author']
        content= item['content']

        self.fp.write(author+':'+content+'
')
        return item #item是返回給了下一個即將被執(zhí)行的管道類

    def close_spider(self,spider):
        print('結(jié)束爬蟲!')
        self.fp.close()

        
#負(fù)責(zé)將數(shù)據(jù)存儲到mysql
class MysqlPL(object):
    conn = None
    cursor = None
    def open_spider(self,spider):
        self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='123',db='spider',charset='utf8')
        print(self.conn)
    def process_item(self,item,spider):
        author = item['author']
        content = item['content']

        sql = 'insert into qiubai values ("%s","%s")'%(author,content)
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            print(e)
            self.conn.rollback()
        return item
    
    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()

#基于redis的管道存儲
class RedisPL(object):
    conn = None
    def open_spider(self,spider):
        self.conn = Redis(host='127.0.0.1',port=6379)
        print(self.conn)
        
    def process_item(self,item,spider):
        self.conn.lpush('all_data',item)     # name  value
        #注意:如果將字典寫入redis報錯:pip install -U redis==2.10.6

View Code

7.2.4scrapy框架之遞歸解析和post請求

遞歸解析(手動請求發(fā)送)

使用場景 :爬取多個頁碼對應(yīng)的頁面源碼數(shù)據(jù)

yield scrapy.Request(url,callback)

import scrapy
from qiubaiPro.items import QiubaiproItem

class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    # allowed_domains = ['http://t.zoukankan.com/www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    #將多個頁碼對應(yīng)的頁面數(shù)據(jù)進(jìn)行爬取和解析的操作
    url = 'https://www.qiushibaike.com/text/page/%d/'#通用的url模板
    pageNum = 1
    #parse第一次調(diào)用表示的是用來解析第一頁對應(yīng)頁面中的段子內(nèi)容和作者
    def parse(self, response):
        div_list = response.xpath('//*[@id="content-left"]/div')
        all_data = []
        for div in div_list:
            # scrapy中的xpath返回的列表的列表元素一定是Selector對象,我們最終想要的解析的
            # 數(shù)據(jù)一定是存儲在該對象中
            # extract()將Selector對象中data參數(shù)的值取出
            # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
            # 列表直接調(diào)用extract表示的是將extract作用到每一個列表元素中
            content = div.xpath('./a[1]/div/span//text()').extract()
            content = ''.join(content)

            # 將解析的數(shù)據(jù)存儲到item對象
            item = QiubaiproItem()
            item['author'] = author
            item['content'] = content

            # 將item提交給管道
            yield item  # item一定是提交給了優(yōu)先級最高的管道類

        if self.pageNum <= 5:
            self.pageNum += 1
            new_url = format(self.url%self.pageNum)
            #手動請求(get)的發(fā)送
            yield scrapy.Request(new_url,callback=self.parse)

View Code

post請求發(fā)送

問題:在之前代碼中,我們從來沒有手動的對start_urls列表中存儲的起始url進(jìn)行過請求的發(fā)送,但是起始url的確是進(jìn)行了請求的發(fā)送,那這是如何實現(xiàn)的呢?

解答:其實是因為爬蟲文件中的爬蟲類繼承到了Spider父類中的start_requests(self)這個方法,該方法就可以對start_urls列表中的url發(fā)起請求:

  def start_requests(self):
        for u in self.start_urls:
           yield scrapy.Request(url=u,callback=self.parse)

【注意】該方法默認(rèn)的實現(xiàn),是對起始的url發(fā)起get請求,如果想發(fā)起post請求,則需要子類重寫該方法。

方法: 重寫start_requests方法,讓其發(fā)起post請求:

def start_requests(self):
        #請求的url
        post_url = 'http://fanyi.baidu.com/sug'
        # post請求參數(shù)
        formdata = {
            'kw': 'wolf',
        }
        # 發(fā)送post請求
        yield scrapy.FormRequest(url=post_url, formdata=formdata, callback=self.parse)

scrapy五大核心組件

#引擎(Scrapy)
  用來處理整個系統(tǒng)的數(shù)據(jù)流處理, 觸發(fā)事務(wù)(框架核心)
#調(diào)度器(Scheduler)
  用來接受引擎發(fā)過來的請求, 壓入隊列中, 并在引擎再次請求的時候返回. 可以想像成一個URL(抓取網(wǎng)頁的網(wǎng)址或者說是鏈接)的優(yōu)先隊列, 由它來決定下一個要抓取的網(wǎng)址是什么, 同時去除重復(fù)的網(wǎng)址
#下載器(Downloader)
  用于下載網(wǎng)頁內(nèi)容, 并將網(wǎng)頁內(nèi)容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)
#爬蟲(Spiders)
  爬蟲是主要干活的, 用于從特定的網(wǎng)頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個頁面
#項目管道(Pipeline)
  負(fù)責(zé)處理爬蟲從網(wǎng)頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當(dāng)頁面被爬蟲解析后,將被發(fā)送到項目管道,并經(jīng)過幾個特定的次序處理數(shù)據(jù)。

工作流程

#步驟
1.spider中的url被封裝成請求對象交給引擎(每一個url對應(yīng)一個請求對象);
2.引擎拿到請求對象之后, 將其全部交給調(diào)度器;
3.調(diào)度器拿到所有請求對象后, 通過內(nèi)部的過濾器過濾掉重復(fù)的url, 最后將去重后的所有url對應(yīng)的請求對象壓入到隊列中, 隨后調(diào)度器調(diào)度出其中一個請求對象, 并將其交給引擎;
4.引擎將調(diào)度器調(diào)度出的請求對象交給下載器;
5.下載器拿到該請求對象去互聯(lián)網(wǎng)中下載數(shù)據(jù);
6.數(shù)據(jù)下載成功后會被封裝到response中, 隨后response會被交給下載器;
7.下載器將response交給引擎;
8.引擎將response交給spiders;
9.spiders拿到response后調(diào)用回調(diào)方法進(jìn)行數(shù)據(jù)解析, 解析成功后產(chǎn)生item, 隨后spiders將item交給引擎;
10.引擎將item交給管道, 管道拿到item后進(jìn)行數(shù)據(jù)的持久化存儲.

7.3基于scrapy進(jìn)行圖片數(shù)據(jù)的爬取

示例 :校花網(wǎng)圖片的爬取

鏈接地址 :http://www.521609.com/daxuemeinv/list81.html

項目的創(chuàng)建

scrapy startproject imgPro

cd imgPro

scrapy genspider img http://t.zoukankan.com/www.xxx.com

如何基于scrapy進(jìn)行圖片的爬取

1.在爬蟲文件中只需要解析出圖片地址,然后將圖片地址提交給管道
2.配置文件中添加  IMAGES_STORE = './imasLib'
1.在管道文件中進(jìn)行管道類的制定:
    from scrapy.pipelines.images import ImagesPipeline
    將管道的父類修改成 ImagesPipeline
    重寫父類的三個方法

代碼:

img.py

import scrapy
from imgPro.items import ImgproItem

class ImgSpider(scrapy.Spider):
    name = 'img'
    # allowed_domains = ['www.x.com']
    start_urls = ['http://www.521609.com/daxuemeinv/']
    url = 'http://www.521609.com/daxuemeinv/list8%d.html'
    pageNum = 1
    def parse(self, response):
        li_list = response.xpath('//*[@id="content"]/div[2]/div[2]/ul/li')
        for li in li_list:
            img_src = 'http://www.521609.com' + li.xpath('./a[1]/img/@src').extract_first()
            item = ImgproItem()
            item['src'] = img_src

            yield item

        if self.pageNum < 4:
            self.pageNum += 1
            new_url = format(self.url%self.pageNum)
            yield scrapy.Request(new_url,callback=self.parse)

View Code

setting.py

##不遵從robotstx協(xié)議
ROBOTSTXT_OBEY = False

#輸出錯誤類型的日志
LOG_LEVEL = 'ERROR'
# LOG_FILE = './log.txt'

#圖片存儲地址
IMAGES_STORE = './imasLib'

ITEM_PIPELINES = {
   'imgPro.pipelines.ImgproPipeline': 300,
}

View Code

pipelines.py

import scrapy
from scrapy.pipelines.images import ImagesPipeline

class ImgproPipeline(ImagesPipeline):

    #對某一個媒體資源進(jìn)行請求發(fā)送
    # item 就是接收到的spider提交的數(shù)據(jù)
    def get_media_requests(self, item, info):
        yield scrapy.Request(item['src'])

    #指定媒體數(shù)據(jù)存儲的名稱
    def file_path(self, request, response=None, info=None):
        #返回原始圖片名稱
        name = request.url.split('/')[-1]
        print("正在下載:",name)
        return name

    #將 item 傳遞給下一個即將被執(zhí)行的管道類
    def item_completed(self, results, item, info):
        return item

View Code

items.py

import scrapy

class ImgproItem(scrapy.Item):
    # define the fields for your item here like:
    src = scrapy.Field()

View Code

如何提升scrapy爬取數(shù)據(jù)的效率

只需要將如下五個步驟配置在配置文件中即可:

#增加并發(fā)
    默認(rèn)scrapy開啟的并發(fā)線程為32個,可以適當(dāng)進(jìn)行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值為100,并發(fā)設(shè)置成了為100。
    
#降低日志級別:
    在運行scrapy時,會有大量日志信息的輸出,為了減少CPU的使用率。可以設(shè)置log輸出信息為INFO或者ERROR即可。在配置文件中編寫:LOG_LEVEL = ‘INFO’

#禁止cookie:
    如果不是真的需要cookie,則在scrapy爬取數(shù)據(jù)時可以禁止cookie從而減少CPU的使用率,提升爬取效率。在配置文件中編寫:COOKIES_ENABLED = False

#禁止重試:
    對失敗的HTTP進(jìn)行重新請求(重試)會減慢爬取速度,因此可以禁止重試。在配置文件中編寫:RETRY_ENABLED = False

#減少下載超時:
    如果對一個非常慢的鏈接進(jìn)行爬取,減少下載超時可以能讓卡住的鏈接快速被放棄,從而提升效率。在配置文件中進(jìn)行編寫:DOWNLOAD_TIMEOUT = 10 超時時間為10s

7.4請求傳參

實現(xiàn)深度爬取:爬取多個層級對應(yīng)的頁面數(shù)據(jù)

使用場景:爬取的數(shù)據(jù)沒有在同一張頁面中

在手動請求的時候傳遞item:yield scrapy.Request(url,callback,meta={'item':item})

將meta這個字典傳遞給callback

在callback中接收meta:item = response.meta['item']

代碼:

movie.py

import scrapy
from moviePro.items import MovieproItem

class MovieSpider(scrapy.Spider):
    name = 'movie'
    # allowed_domains = ['http://t.zoukankan.com/www.xxx.com']
    start_urls = ['https://www.4567tv.tv/index.php/vod/show/class/動作/id/5.html']

    url = 'https://www.4567tv.tv/index.php/vod/show/class/動作/id/5/page/%d.html'
    pageNum = 1
    def parse(self, response):
        li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
        for li in li_list:
            title = li.xpath('./div[1]/a/@title').extract_first()
            detail_url = "https://www.4567tv.tv" + li.xpath('./div[1]/a/@href').extract_first()

            item = MovieproItem()
            item['title'] = title
            # meta參數(shù)是一個字典,該參數(shù)可以傳遞給callback指定的回調(diào)函數(shù),
            yield scrapy.Request(detail_url,callback=self.parse_detail,meta={'item':item})

        if self.pageNum < 5:
            self.pageNum += 1
            new_url = format(self.url%self.pageNum)
            yield scrapy.Request(new_url,callback=self.parse)


    def parse_detail(self,response):
        #接收參數(shù) response.meta
        item = response.meta['item']
        #簡介
        desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
        item['desc'] = desc
        yield item

View Code

setting.py

BOT_NAME = 'moviePro'

SPIDER_MODULES = ['moviePro.spiders']
NEWSPIDER_MODULE = 'moviePro.spiders'

# UA偽裝
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False
#輸出錯誤類型的日志
LOG_LEVEL = 'ERROR'


ITEM_PIPELINES = {
   'moviePro.pipelines.MovieproPipeline': 300,
}

View Code

items.py

import scrapy

class MovieproItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    desc = scrapy.Field()

View Code

pipelines.py

class MovieproPipeline(object):
    def process_item(self, item, spider):
        print(item)
        return item

View Code

7.5scrapy中的中間件的應(yīng)用

1.請求載體身份標(biāo)識(可用)

user_agent_list = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
        "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

View Code

3.代理池(不可用)

PROXY_http = [
    '153.180.102.104:80',
    '195.208.131.189:56055',
]
PROXY_https = [
    '120.83.49.90:9000',
    '95.189.112.214:35508',
]

View Code

3.爬蟲中間件

4.下載中間件

作用 :批量攔截請求和響應(yīng)

攔截請求

UA偽裝 :將所有的請求盡可能多的設(shè)定成不同的請求載體身份標(biāo)識

代理操作

rom scrapy import signals
import random
user_agent_list = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
        "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

PROXY_http = [
    '153.180.102.104:80',
    '195.208.131.189:56055',
]
PROXY_https = [
    '120.83.49.90:9000',
    '95.189.112.214:35508',
]

# 下載中間件
class MovieproDownloaderMiddleware(object):

    # 攔截正常的請求,參數(shù) request 就是攔截到請求對象
    def process_request(self, request, spider):
        print("i am process_request")
        #實現(xiàn):將攔截到的請求盡可能多的設(shè)定成不同的請求載體身份標(biāo)識
        request.headers['USER_AGENT'] = random.choice(user_agent_list)

        if request.url.split(":")[0] == "http":
            request.meta['proxy'] = 'http://' + random.choice(PROXY_http)
        else:
            request.meta['proxy'] = 'https://' + random.choice(PROXY_https)
        return None


    # 攔截響應(yīng),參數(shù) request 就是攔截到響應(yīng)
    def process_response(self, request, response, spider):
        print("i am process_response")
        return response

    # 攔截發(fā)生異常的請求
    def process_exception(self, request, exception, spider):
        print("i am process_exception")
        #攔截到異常的請求,然后對其進(jìn)行修正,然后重新進(jìn)行請求發(fā)送
        #代理操作
        if request.url.split(":")[0] == "http":
            request.meta['proxy'] = 'http://' + random.choice(PROXY_http)
        else:
            request.meta['proxy'] = 'https://' + random.choice(PROXY_https)
        #將修正后的請求進(jìn)行重新發(fā)送
        return request

View Code

攔截響應(yīng)

篡改響應(yīng)數(shù)據(jù)或直接替換響應(yīng)對象

需求 : 爬取網(wǎng)易新聞 國內(nèi),國際,軍事,航空,無人機(jī)這五個板塊下對應(yīng)的新聞標(biāo)題和內(nèi)容

#分析:
1.每一個板塊對應(yīng)的新聞數(shù)據(jù)是動態(tài)加載出來的

# selenium在scrapy中的應(yīng)用:
    實例化瀏覽器對象:卸載爬蟲類的構(gòu)造方法中

wangyi.py

import scrapy
from selenium import webdriver
from wangyiPro.items import WangyiproItem

class WangyiSpider(scrapy.Spider):
    name = 'wangyi'
    # allowed_domains = ['http://t.zoukankan.com/www.xxx.com']
    start_urls = ['https://news.163.com']

    five_model_urls = []
    #實例化一個瀏覽器對象
    bro = webdriver.Chrome(executable_path=r'E:飛秋爬蟲+數(shù)據(jù)	oolschromedriver.exe')
    #用來解析五個板塊對應(yīng)的url,然后對齊進(jìn)行手動請求發(fā)送
    def parse(self, response):
        model_index = [3,4,6,7,8]
        li_list = response.xpath('//*[@id="index2016_wrap"]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li')

        for index in model_index:
            li = li_list[index]
            #獲取五個板塊對應(yīng)的url
            model_url = li.xpath('./a/@href').extract_first()
            self.five_model_urls.append(model_url)
            #對每個板塊的url進(jìn)行手動請求發(fā)送
            yield scrapy.Request(model_url,callback=self.parse_model)

    #用作與解析每個板塊中的新聞標(biāo)題和新聞詳情頁的url
    #問題:response(不滿足需求的response)沒有包含每一個板塊中動態(tài)加載的新聞數(shù)據(jù)
    def parse_model(self,response):
        div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div/div/ul/li/div/div')
        for div in div_list:
            title = div.xpath('./div/div[1]/h3/a/text()').extract_first()
            detail_url = div.xpath('./div/div[1]/h3/a/@href').extract_first()
            item = WangyiproItem()
            item['title'] = title
            #對詳情頁發(fā)起請求解析出新聞內(nèi)容
            yield scrapy.Request(detail_url,callback=self.prase_new_detail,meta={'item':item})

    def prase_new_detail(self,response):
        item = response.meta['item']
        content = response.xpath('//*[@id="endText"]//text()').extract()
        content = ''.join(content)
        item['content'] = content
        yield  item

    #最后執(zhí)行
    def closed(self,spider):
        self.bro.quit()

View Code

items.py

import scrapy

class WangyiproItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    content = scrapy.Field()

View Code

middlewares.py

from scrapy import signals
from scrapy.http import HtmlResponse
from time import sleep

class WangyiproDownloaderMiddleware(object):

    def process_request(self, request, spider):

        return None

    # spider 就是爬蟲文件中爬蟲類實例化的對象
    def process_response(self, request, response, spider):
        #進(jìn)行所有響應(yīng)對象的攔截
        # 1.將所有響應(yīng)對象中那五個不滿足需求的響應(yīng)對象找出
            #每個響應(yīng)對象對應(yīng)唯一一個請求對象
            #如果我們定位到五個響應(yīng)對象的請求對象后,就可以通過該請求對象定位到指定的響應(yīng)對象
            #可以通過五個板塊的 url 定位請求對象
                #總結(jié): url ==> request ==> response
        # 2.將找出的五個不滿足需求的響應(yīng)對象進(jìn)行修正(替換)

        #  spider.five_model_urls :五個板塊對應(yīng)的url
        bro = spider.bro
        if request.url in spider.five_model_urls:
            bro.get(request.url)
            sleep(1)
            #包含了動態(tài)加載的新聞數(shù)據(jù)
            page_text = bro.page_source
            #如果if條件成立,則該response就是五個板塊對應(yīng)的響應(yīng)對象
            new_response = HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)
            return new_response
        return response

    def process_exception(self, request, exception, spider):
        pass

View Code

pipelines.py

class WangyiproPipeline(object):
    def process_item(self, item, spider):
        print(item)
        return item

View Code

setting.py

BOT_NAME = 'wangyiPro'

SPIDER_MODULES = ['wangyiPro.spiders']
NEWSPIDER_MODULE = 'wangyiPro.spiders'

# UA偽裝
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'

DOWNLOADER_MIDDLEWARES = {
   'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,
}

ITEM_PIPELINES = {
   'wangyiPro.pipelines.WangyiproPpeline': 300,
}

View Code

7.6.基于CrawSpider的全站數(shù)據(jù)爬取

CrawSpider簡介

CrawSpider就是爬蟲類中 Spider的一個子類

除了繼承到Spider的特性和功能外,還派生除了其自己獨有的更加強(qiáng)大的特性和功能。其中最顯著的功能就是”LinkExtractors鏈接提取器“。Spider是所有爬蟲的基類,其設(shè)計原則只是為了爬取start_url列表中網(wǎng)頁,而從爬取到的網(wǎng)頁中提取出的url進(jìn)行繼續(xù)的爬取工作使用CrawlSpider更合適。

使用流程

1.創(chuàng)建一個基于CrawSpider的爬蟲文件 : 
    scrapy startproject sunPro
    cd sunPro
    scrapy genspider -t crawl spiderName http://t.zoukankan.com/www.xxx.com
2.構(gòu)造鏈接提取器和規(guī)則解析器
    鏈接提取器
        作用:可根據(jù)指定的規(guī)則進(jìn)行指定鏈接的提取
         提取規(guī)則:allow = '正則表達(dá)式'
    規(guī)則解析器
        作用:獲取鏈接提取器提取到的鏈接,然后進(jìn)行請求發(fā)送,根據(jù)指定規(guī)則對請求到的頁面源碼數(shù)據(jù)進(jìn)行數(shù)據(jù)解析
        follow = 'True' :將鏈接提取器 繼續(xù)作用到 鏈接提取器所提取到的頁碼鏈接所對應(yīng)的頁面中 

7.6.1 基于CrawSpider的基本使用

數(shù)據(jù)鏈接地址 :http://wz.sun0769.com/index.php/question/questionType?type=4&page=

sun.py

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

#未實現(xiàn)深度爬取:爬取的只是每個頁面對應(yīng)的數(shù)據(jù)
class SunSpider(CrawlSpider):
    name = 'sun'
    # allowed_domains = ['http://t.zoukankan.com/www.xxx.com']
    start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']
    #鏈接提取器  type=4&page=d+
    link = LinkExtractor(allow=r'type=4&page=d+')

    rules = (
        #實例化一個Rule(規(guī)則解析器)的對象
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
        for tr in tr_list:
            title = tr.xpath('./td[2]/a[2]/@title').extract_first()
            status = tr.xpath('./td[3]/span/text()').extract_first()
            print(title,status)

View Code

setting.py

BOT_NAME = 'sunPro'

SPIDER_MODULES = ['sunPro.spiders']
NEWSPIDER_MODULE = 'sunPro.spiders'

# UA偽裝
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'

View Code

7.6.2 基于CrawSpider的深度爬取

sun.py

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunPro.items import SunproItem,SunproItem_detail

class SunSpider(CrawlSpider):
    name = 'sun'
    # allowed_domains = ['http://t.zoukankan.com/www.xxx.com']
    start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']
    #鏈接提取器
    link = LinkExtractor(allow=r'type=4&page=d+')

    #詳情頁url  question/201909/426989.shtml
    link_detail = LinkExtractor(allow=r'question/d+/d+.shtml')

    rules = (
        #實例化一個Rule(規(guī)則解析器)的對象
        Rule(link, callback='parse_item', follow=True),
        Rule(link_detail, callback='parse_datail'),
    )

    def parse_item(self, response):
        tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
        for tr in tr_list:
            title = tr.xpath('./td[2]/a[2]/@title').extract_first()
            status = tr.xpath('./td[3]/span/text()').extract_first()
            num = tr.xpath('./td[1]/text()').extract_first()
            item = SunproItem()
            item['title'] = title
            item['status'] = status
            item['num'] = num
            if num:
                yield item

    def parse_datail(self,response):
        content = response.xpath('/html/body/div[9]/table[2]/tbody/tr[1]//text()').extract()
        content = ''.join(content)
        num = response.xpath('/html/body/div[9]/table[1]/tbody/tr/td[2]/span[2]/text()').extract_first()
        if num:
            num = num.split(':')[-1]
            item = SunproItem_detail()
            item['content'] = content
            item['num'] = num
            yield item

View Code

pipelines.py

class SunproPipeline(object):
    def process_item(self, item, spider):

        if item.__class__.__name__ == "SunproItem_detail":
            content = item['content']
            num = item['num']
            print(content,num)
        else:
            title = item['title']
            status = item['status']
            num = item['num']
            print(title,status,num)

View Code

items.py

class SunproItem(scrapy.Item):
    title = scrapy.Field()
    status = scrapy.Field()
    num = scrapy.Field()

class SunproItem_detail(scrapy.Item):
    content = scrapy.Field()
    num = scrapy.Field()

View Code

7.7.分布式

7.7.1基本概念

什么是分布式爬蟲?

基于多臺電腦組建一個分布式機(jī)群,然后讓機(jī)群中的每一臺電腦執(zhí)行同一組程序,然后讓它們對同一個網(wǎng)站的數(shù)據(jù)進(jìn)行分布爬取

為什么要用分布式爬蟲?

提升爬取數(shù)據(jù)的效率

如何實現(xiàn)分布式爬蟲?

基于scrapy + redis 的形式實現(xiàn)分布式

scrapy 結(jié)合著 scrapy-redis組件實現(xiàn)分布式

原生的scrapy無法實現(xiàn)分布式原因?

調(diào)度器無法被分布式群共享

管道無法被共享

scrapy-redis組件的作用

提供可以被共享的調(diào)度器和管道

環(huán)境安裝:

pip insatll redis

pip install scrapy-redis

7.7.2分布式流程

#1.創(chuàng)建一個基于CrawSpider的爬蟲文件 : 
    scrapy startproject sunPro
    cd sunPro
    scrapy genspider -t crawl spiderName http://t.zoukankan.com/www.xxx.com
#2.修改當(dāng)前的爬蟲文件
    1.導(dǎo)包 : from scrapy_redis.spiders import RedisCrawlSpider
       2.將當(dāng)前爬蟲類的父類修改成RedisCrawlSpider
    3.將start_urls替換成redis_key = 'xxx'  #表示的是可被共享調(diào)度器中隊列的名稱
    4.編寫爬蟲類爬取數(shù)據(jù)的操作
#3.對setting進(jìn)行操作 
    #指定管道
        開啟可被共享的管道 :
            ITEM_PIPELINES = {
                'scrapy_redis.pipelines.RedisPipeline': 400
                }
    #指定可被共享的調(diào)度器
    
# 增加了一個去重容器類的配置, 作用使用Redis的set集合來存儲請求的指紋數(shù)據(jù), 從而實現(xiàn)請求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis組件自己的調(diào)度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置調(diào)度器是否要持久化, 也就是當(dāng)爬蟲結(jié)束了, 要不要清空Redis中請求隊列和去重指紋的set。如果是True, 就表示要持久化存儲, 就不清空數(shù)據(jù), 否則清空數(shù)據(jù)
SCHEDULER_PERSIST = True  

    #指定redis服務(wù)
        REDIS_HOST = 'redis服務(wù)的ip地址'
        REDIS_PORT = 6379
        
#4.對redis配置文件進(jìn)行配置 (redis.windows.conf)
    56行 :  #bind 127.0.0.1
    75行 :  protected-mode yes  --> protected-mode no
#5.攜帶配置文件啟動redis服務(wù)   redis-server .edis.windows.conf
    地址: E:飛秋爬蟲+數(shù)據(jù)	oolsedisRedis-x64-3.2.100
#6.啟動redis客戶端 :  redis-cli
#7.執(zhí)行當(dāng)前的工程
    進(jìn)入到爬蟲文件對應(yīng)的目錄中:scrapy runspider xxx.py
#8.向調(diào)度器隊列中仍入一個起始的url:
    隊列在哪里呢?
    答:隊列在redis中        lpush fbsQueue http://t.zoukankan.com/www.xxx.com

代碼

fbs.py

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from fbsPro.items import FbsproItem

class FbsSpider(RedisCrawlSpider):
    name = 'fbs'
    # allowed_domains = ['http://t.zoukankan.com/www.xxx.com']
    # start_urls = ['http://http://t.zoukankan.com/www.xxx.com/']

    # redis_key表示的是可被共享調(diào)度器中隊列的名稱
    redis_key = 'fbsQueue'

    rules = (
        Rule(LinkExtractor(allow=r'type=4&page=d+'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
        for tr in tr_list:
            title = tr.xpath('./td[2]/a[2]/@title').extract_first()
            status = tr.xpath('./td[3]/span/text()').extract_first()

            item = FbsproItem()
            item['title'] = title
            item['status'] = status
            yield item

View Code

items.py

import scrapy


class FbsproItem(scrapy.Item):
    title = scrapy.Field()
    status = scrapy.Field()

View Code

settings.py

BOT_NAME = 'fbsPro'

SPIDER_MODULES = ['fbsPro.spiders']
NEWSPIDER_MODULE = 'fbsPro.spiders'

ROBOTSTXT_OBEY = True

#開啟可被共享的管道
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400
}

#指定可被共享的調(diào)度器
# 增加了一個去重容器類的配置, 作用使用Redis的set集合來存儲請求的指紋數(shù)據(jù), 從而實現(xiàn)請求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis組件自己的調(diào)度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置調(diào)度器是否要持久化, 也就是當(dāng)爬蟲結(jié)束了, 要不要清空Redis中請求隊列和去重指紋的set。如果是True, 就表示要持久化存儲, 就不清空數(shù)據(jù), 否則清空數(shù)據(jù)
SCHEDULER_PERSIST = True

#指定redis服務(wù)
REDIS_HOST = '192.168.11.50'
REDIS_PORT = 6379

View Code

7.8 增量式爬蟲

總結(jié)

以上是生活随笔為你收集整理的python爬虫入门 之 移动端数据的爬取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

天天操天天干天天爱 | 国产精品免费久久久久影院仙踪林 | 成人影音在线 | 亚洲精品456在线播放第一页 | 久久免费看毛片 | 成人精品一区二区三区电影免费 | 黄污网| 五月婷婷六月综合 | 亚洲成人二区 | 在线播放国产一区二区三区 | 欧美极品久久 | 91在线中字 | 青青久视频 | 黄色aa久久| 黄色高清视频在线观看 | 91你懂的 | 又粗又长又大又爽又黄少妇毛片 | 91丨九色丨蝌蚪丨老版 | 成 人 黄 色 视频 免费观看 | 亚洲成人精品av | 日韩精品 在线视频 | 99精品欧美一区二区蜜桃免费 | 人人要人人澡人人爽人人dvd | 97人人澡人人爽人人模亚洲 | 黄色特级一级片 | 久久tv | 日本中文在线 | 国产亚洲va综合人人澡精品 | 91污污视频在线观看 | 国产99久久久国产精品成人免费 | 国产第一页福利影院 | 亚洲闷骚少妇在线观看网站 | 在线免费观看涩涩 | 亚洲国产精品久久久久婷婷884 | 中文字幕在线视频第一页 | 狠狠干成人 | 天天天色综合a | 色a在线观看 | 国产手机视频在线播放 | 精品久久久久久亚洲综合网站 | 精品国产中文字幕 | 色五丁香 | 日韩中文字幕a | 色视频 在线 | a特级毛片| 久久人人爽人人片 | 久草视频免费播放 | 欧美网址在线观看 | 天天草天天干天天射 | 日韩啪啪小视频 | 一级黄色片在线免费看 | 国产一二三在线视频 | 精品久久久久久电影 | 天海冀一区二区三区 | 2024av | 91精品在线免费观看视频 | 久久99精品久久久久婷婷 | 超碰97人 | 91亚洲精品国产 | 国产精品久久久久久久久久久免费看 | 中文字幕黄色网址 | 亚洲视频国产 | 亚洲欧美婷婷六月色综合 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 午夜精品一区二区三区免费视频 | 国产精品乱码高清在线看 | 四虎www| 国产喷水在线 | 久久影院精品 | 国产小视频免费在线观看 | 国产成人精品国内自产拍免费看 | 99在线免费视频 | 国产在线97 | 日韩在线视 | 国产精品99久久99久久久二8 | 天天爱天天操天天射 | 国产成人精品一区在线 | 日韩中文字幕免费在线观看 | 狠狠的操你 | 一区二区三区免费在线观看视频 | 国产成人一级 | 久久大片 | 日韩久久在线 | 精品视频在线播放 | 久草精品免费 | 久久激情视频免费观看 | 国产伦精品一区二区三区免费 | 激情伊人五月天 | 久久久官网 | 黄色小说在线免费观看 | 欧美日本在线观看视频 | 免费在线观看不卡av | 人人爽人人射 | 中文理论片 | 国产成人一区二区三区免费看 | 亚洲精品视频在线观看免费视频 | 日日夜夜91| 香蕉视频最新网址 | 国产高清精 | 久久综合中文字幕 | 五月天伊人网 | 日本精品一区二区三区在线播放视频 | 亚洲一区欧美激情 | 国产一区二区三区免费观看视频 | av成人在线观看 | 国产一区二区在线免费视频 | 一区二区三区四区久久 | 国产视频一区二区在线 | 成人av免费播放 | 99久久电影| 亚洲精品无 | 国产精品久久久 | 国产精品毛片久久蜜 | 亚洲黄色精品 | 波多野结衣视频一区二区 | 激情视频综合网 | 亚洲春色综合另类校园电影 | 超碰97公开| 国产资源免费在线观看 | 波多野结衣一区二区三区中文字幕 | 久久久久中文 | 国产网红在线观看 | 日韩精品视频第一页 | 精品中文字幕视频 | 亚洲视频 在线观看 | 国产精彩在线视频 | 亚洲国产日韩在线 | 中文区中文字幕免费看 | 日韩com| 日韩黄色一级电影 | 欧美日韩免费视频 | 国内精品久久久久久久97牛牛 | 中文字幕在线观看第一区 | 国产一区免费在线 | 中文字幕一区二区三区在线观看 | 亚洲丁香日韩 | 日本中文字幕在线观看 | 免费亚洲一区二区 | 伊人宗合网 | 国产99久久精品一区二区永久免费 | 精品电影一区二区 | 婷婷丁香导航 | 国产午夜在线观看 | 中文字幕a∨在线乱码免费看 | 91热视频在线观看 | 91精品爽啪蜜夜国产在线播放 | 天天操天天摸天天爽 | 九九热免费在线视频 | 日韩免费电影一区二区 | 夜夜夜影院 | 精品国产激情 | 五月婷婷天堂 | 婷婷六月天丁香 | 国产成人一区二区在线观看 | 国产精品麻豆果冻传媒在线播放 | 国产福利91精品张津瑜 | 国产成人综合图片 | 久久精品视频免费观看 | 97日日 | 91视频久久久 | 亚洲激情婷婷 | 精品久久久久久综合日本 | 日韩理论片在线观看 | www激情com | 成人性生交大片免费看中文网站 | 尤物一区二区三区 | 色天天综合网 | 手机av观看 | 成人影片免费 | 欧美在线一二 | 婷婷六月激情 | 欧美国产日韩在线视频 | 成人免费视频观看 | 久久蜜臀一区二区三区av | 视频一区二区在线 | 欧美 日韩 国产 中文字幕 | 天天干天天综合 | 国内偷拍精品视频 | 麻豆传媒电影在线观看 | 天天操天天射天天插 | 国产精品久久久久永久免费观看 | 精品美女在线视频 | 黄p网站在线观看 | 中文字幕在线一区二区三区 | 伊人午夜视频 | 欧美成人基地 | 98久久| 人人干人人做 | 久久免费国产精品1 | 中文字幕a在线 | 69人人 | 日本精品久久久久中文字幕5 | 久久精品91视频 | 日韩精品一区二区在线观看 | 久久久影院一区二区三区 | 亚洲精选视频在线 | 成年一级片 | 手机在线观看国产精品 | 久久综合久久八八 | 久久观看最新视频 | 91视频高清免费 | 国偷自产视频一区二区久 | 91在线日本| 在线观看的黄色 | aa一级片 | 99热精品久久 | 视频精品一区二区三区 | 国产福利91精品 | av在线播放中文字幕 | 日韩精品免费一区二区 | 免费看的国产视频网站 | 97在线视频观看 | 成人三级网址 | 国产精品一区二区三区免费看 | 91亚洲精品久久久蜜桃网站 | 最新日韩电影 | 免费精品久久久 | 91精品国产91久久久久福利 | 国产精品99久久免费黑人 | 香蕉免费在线 | 99热精品在线 | 日韩欧美一区二区三区视频 | 狠狠插天天干 | 成人九九视频 | 婷婷六月色 | 国产成人精品综合久久久 | 欧洲精品二区 | 国产精品久久久久久99 | 成人久久 | 国产中文在线播放 | 国产精品美女久久久久久2018 | 欧美91片 | 免费又黄又爽 | 日韩av资源站 | 国产精品国产三级国产不产一地 | 96av在线视频 | 国产精品久久久久久久久搜平片 | 色福利网站| 夜夜狠狠 | 亚洲天天干 | 国产精品涩涩屋www在线观看 | 在线亚洲精品 | 超薄丝袜一二三区 | 99精品视频在线播放免费 | 国产精品va最新国产精品视频 | 国产在线观看免费 | 懂色av一区二区在线播放 | 成人宗合网 | 在线观看视频一区二区三区 | 中文字幕日韩在线播放 | 久久国产免费看 | 国产欧美日韩视频 | 黄色成人免费电影 | 免费色视频网站 | 国产精品免费大片视频 | 亚洲影视九九影院在线观看 | 国产精品porn | 日韩中文在线观看 | 欧美在线free| 中文字幕在线视频免费播放 | www.五月激情.com | 一区二区三区日韩在线观看 | 日韩一区二区三免费高清在线观看 | 国产亚洲成人网 | 精品特级毛片 | 亚洲va欧美va | www狠狠操 | 又色又爽的网站 | 五月精品| 五月天亚洲综合 | 激情久久网 | 久久九九国产视频 | 91精品久久久久久综合五月天 | 婷婷激情五月 | 999成人精品 | 日韩二区三区 | 一级免费看| 在线观看国产永久免费视频 | 天天射天天色天天干 | 国产日韩欧美在线看 | 国产成人三级在线 | 国产精品久久毛片 | 美女视频黄是免费的 | 国产盗摄精品一区二区 | 国产精品久久久久久久久久白浆 | 国际精品网 | 久艹视频免费观看 | 久艹在线播放 | 九九久久影院 | 久久精品91视频 | 欧美日韩中文另类 | 国产精品手机看片 | 天天干,天天干 | 久草男人天堂 | japanesexxxhd奶水 国产一区二区在线免费观看 | 97成人精品区在线播放 | 97人人射| 午夜精品成人一区二区三区 | 日韩成人精品 | 国产高清在线观看av | 日韩精品专区 | 精品国产视频在线 | 免费av网站在线看 | 91亚洲精品乱码久久久久久蜜桃 | 一区二区三高清 | 亚洲欧洲在线视频 | 97成人在线视频 | 999成人国产 | 91精品久久香蕉国产线看观看 | 免费视频一二三区 | 狠狠色噜噜狠狠狠狠 | 黄色资源在线 | 久久精品中文视频 | 久久久综合九色合综国产精品 | 在线观看911视频 | 99热在线国产精品 | 五月婷婷丁香六月 | 婷婷在线观看视频 | 国产91大片| 96久久| 精品色999 | 日本久久久久久久久久 | 91激情视频在线播放 | 色妞色视频一区二区三区四区 | 中文字幕在线影视资源 | 91精品视频一区二区三区 | 手机成人在线电影 | 色综合天天综合在线视频 | 日韩91在线| 91精品伦理 | 欧美日韩免费观看一区=区三区 | 成人作爱视频 | 丁香激情综合 | 精品福利在线视频 | 最近中文字幕大全中文字幕免费 | 国产精品专区h在线观看 | 国产在线超碰 | 国产精品美女久久久久久久 | www.av免费观看 | 婷婷丁香九月 | 亚洲精品国精品久久99热 | 天天色天天上天天操 | 日本公妇在线观看高清 | 96亚洲精品久久 | 黄色三级在线看 | 日韩天天干 | 在线成人免费 | 日韩毛片精品 | 国产操在线 | 中文字幕人成不卡一区 | 亚州日韩中文字幕 | 亚洲最大在线视频 | 国产一区二三区好的 | av888av.com | 国产美女在线观看 | www操操操 | 狠狠躁夜夜a产精品视频 | 国产一区视频导航 | 911av视频 | 天天干亚洲 | 一区二区精品视频 | 蜜臀av夜夜澡人人爽人人桃色 | 国产精久久久 | 精品国产一区二区三区噜噜噜 | 9在线观看免费高清完整版在线观看明 | 91手机电视 | 看污网站| 色吊丝在线永久观看最新版本 | 久久久精品一区二区 | www.狠狠操.com | 国产亚洲精品久久久久久大师 | 一区二区三区日韩在线 | 国产精品成人久久久 | 久久视频精品在线 | 在线免费观看黄网站 | 日韩免费不卡av | 日韩欧美在线视频一区二区三区 | 亚洲少妇激情 | 天天操天天谢 | 激情久久久久久久久久久久久久久久 | 久久国产手机看片 | 日本久久综合视频 | 91福利专区 | 丁香六月久久综合狠狠色 | 视频一区视频二区在线观看 | 日韩欧美高清一区二区三区 | 丁香六月激情婷婷 | 国产亚州av | 亚洲精品国产拍在线 | 亚洲欧美国产精品 | 日韩视频免费播放 | 精品国产伦一区二区三区观看体验 | 免费看片日韩 | 香蕉影视在线观看 | 插婷婷 | 99免费国产 | 日韩精品久久久久久中文字幕8 | 免费成人在线视频网站 | 欧美ⅹxxxxxx | 在线观看黄色大片 | 久久综合中文色婷婷 | 日韩精品影视 | 成人a级大片 | 激情综合电影网 | 国产成人在线免费观看 | 激情五月婷婷激情 | 国产理论在线 | 久草视频资源 | 黄色软件视频网站 | 亚洲成人一二三 | 亚洲精品资源在线观看 | 国产精品地址 | 午夜在线免费观看 | 久久久久久久国产精品 | 久久人人97超碰com | av亚洲产国偷v产偷v自拍小说 | 免费成人av电影 | 国产成人在线网站 | 日韩区在线观看 | 国产精品一区二区免费视频 | 成人97视频一区二区 | 日韩理论电影在线 | 欧美另类亚洲 | www.天天射.com | 免费在线观看av电影 | 韩日色视频 | a天堂最新版中文在线地址 久久99久久精品国产 | 深爱婷婷久久综合 | 2019免费中文字幕 | 973理论片235影院9 | 狠狠的操狠狠的干 | 91麻豆精品91久久久久同性 | 日韩欧美成 | 欧美一级免费片 | 国产精品自产拍在线观看蜜 | 麻豆国产精品视频 | 日韩精品久久久久久久电影99爱 | 国产小视频国产精品 | 国产视频69 | 天天看天天操 | 久久精品2| 日韩av电影免费在线观看 | 成年人在线免费看视频 | 中文字幕在线播放第一页 | 丝袜美腿在线 | 日韩成人精品在线观看 | 精品不卡av| 日韩精品一区二区三区电影 | 伊人狠狠干 | 国产不卡av在线 | 天天天干夜夜夜操 | 丁香花在线观看视频在线 | 91系列在线观看 | 亚洲黄色激情小说 | av一区二区三区在线播放 | 国产精品免费不 | 国产精品一区二区三区视频免费 | 久久久久久久久久久久久9999 | 伊人午夜 | 人人玩人人添人人澡超碰 | 日本精品一区二区三区在线观看 | 超碰在97 | 免费高清在线观看成人 | 91视频久久久 | 久久久久精 | 日韩激情中文字幕 | 欧美黄污视频 | 国产在线观看免费观看 | 色婷婷综合久久久 | 久久久久久免费网 | 麻豆久久久久久久 | av在线免费在线 | 在线中文视频 | 成年人视频免费在线播放 | 99亚洲精品在线 | 国产一在线精品一区在线观看 | 麻豆传媒电影在线观看 | 亚洲人成精品久久久久 | 久久久久国产成人免费精品免费 | 国产成人久久精品77777 | av动态图片 | 亚洲自拍自偷 | 狠狠狠狠狠狠干 | 日韩欧美在线播放 | 免费黄色网址网站 | 中文字幕在线视频一区二区 | 日韩美av在线 | 天堂网中文在线 | 色婷婷综合久久久中文字幕 | 久久精品看片 | 日本精品视频一区二区 | 中文字幕一区二区三区在线播放 | 日韩亚洲在线 | 91在线视频免费播放 | 丝袜美腿在线视频 | 亚洲激情在线播放 | 日本三级不卡视频 | 久久久国产99久久国产一 | 日韩av电影免费在线观看 | 亚洲国产中文在线观看 | 高清av不卡 | 国产精品国内免费一区二区三区 | 一区二区三区精品在线视频 | 亚洲精品国产麻豆 | 日日操网站 | 久久精品美女 | 国产成人av网址 | 日韩av高清在线观看 | 久久久av电影 | 中文视频在线看 | 国产黄在线| 欧美性大胆| 激情五月亚洲 | 欧美精品一区在线发布 | 久久99国产精品二区护士 | 69国产成人综合久久精品欧美 | 激情综合电影网 | 久久国产精品精品国产色婷婷 | 国内精品久久久久影院优 | 国产成人在线观看免费 | 在线观看aa| 国产特级毛片aaaaaa毛片 | 国产精品久久久久久久久久妇女 | 国产黄a三级三级 | 九九综合在线 | 黄色www免费| 久久精品直播 | 国产精品视频永久免费播放 | 亚洲成av人片在线观看www | 日韩在线观看视频在线 | 999久久精品 | 成人国产亚洲 | 在线观看日韩中文字幕 | 免费观看的黄色片 | 人人澡人 | 特级大胆西西4444www | 国产亚洲综合在线 | 九九热只有精品 | 久久久久久精 | 国产高清在线免费视频 | 91原创在线观看 | 91片黄在线观看动漫 | 免费男女羞羞的视频网站中文字幕 | 亚洲国产成人精品在线 | 人人射人人爱 | 日韩区在线观看 | 亚洲一区久久 | 国产日韩欧美精品在线观看 | 探花视频在线观看+在线播放 | 久久韩国免费视频 | 午夜精品一区二区三区四区 | 日韩欧美在线视频一区二区 | 国产福利av | 在线观看精品国产 | 色综合久久久久网 | 五月丁色 | www.成人久久 | 亚洲午夜精品一区 | 欧美伦理一区 | 探花视频在线版播放免费观看 | 香蕉手机在线 | 九九视频在线观看视频6 | 网站免费黄 | 婷婷夜夜 | 日韩精品91偷拍在线观看 | 久久99亚洲热视 | 高清av中文在线字幕观看1 | 久久人人爽人人片av | 欧美日韩激情视频8区 | 日韩高清二区 | 国产高清在线a视频大全 | 97热在线观看 | 成人久久久久久久久久 | 久久草av | 国产一级精品视频 | 精品自拍sae8—视频 | 国产一区二区在线视频观看 | 色婷婷综合成人av | 日韩精品一区不卡 | 久草免费在线视频观看 | 国产很黄很色的视频 | 久久九九国产精品 | 五月婷婷色综合 | 免费瑟瑟网站 | 片黄色毛片黄色毛片 | 中文字幕日韩一区二区三区不卡 | 99久久精品免费视频 | 免费三级a| 日韩av在线免费播放 | 欧美日韩视频免费 | 国产色道 | 激情视频91| 国产一级在线播放 | 日韩毛片在线一区二区毛片 | 黄色a视频 | 国产美女视频 | 深爱开心激情 | 天天爱天天舔 | 国产高清区 | 国产成人av网址 | 欧美一二三视频 | 午夜国产在线 | 四虎免费在线观看 | 亚洲黄色片 | 国产中文字幕大全 | 国产白浆在线观看 | 四虎影视成人永久免费观看视频 | 久久久久久久久久久久电影 | 成人免费中文字幕 | 日韩欧美精品在线观看 | 热久久精品在线 | 欧美一区中文字幕 | 亚洲精品女人久久久 | av电影免费观看 | 久草免费在线 | 国产婷婷视频在线 | 国产成人精品一区在线 | 国内精品久久久久久久久久 | 奇米7777狠狠狠琪琪视频 | 在线观看av小说 | 一区二区三区在线观看免费 | 天天摸日日摸人人看 | 久久影院精品 | 亚洲成人av一区 | 欧美一级高清片 | 中文字幕888 | 国产精品99精品久久免费 | 免费在线观看成人 | 亚洲成人精品久久久 | 国产视频一级 | 91精品视频免费观看 | 久久久久久久免费观看 | 久久精品aaa | 婷婷网站天天婷婷网站 | a在线免费观看视频 | 99久久精品免费一区 | 天天操天天干天天操天天干 | 亚洲精品视频在线观看免费视频 | 中文字幕一区在线 | 国产无限资源在线观看 | 亚洲欧美婷婷六月色综合 | 综合久久网站 | 国产精品18久久久久白浆 | 国产精品男女视频 | 国产精品亚洲片夜色在线 | 伊人手机在线 | 精品在线免费视频 | 97免费在线观看视频 | 午夜精品电影 | 日韩视频免费观看高清 | 97精品国产97久久久久久免费 | 亚洲人在线7777777精品 | 欧美日韩1区 | 99视频在线精品国自产拍免费观看 | 亚洲精品免费在线视频 | 麻豆精品视频在线 | 探花视频在线版播放免费观看 | 香蕉视频网站在线观看 | 91传媒在线观看 | 在线观看色网 | 色婷婷电影网 | 亚洲电影网站 | 婷婷.com| 激情 婷婷 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 亚洲精品国产日韩 | 91漂亮少妇露脸在线播放 | 天天射天天爱天天干 | 深爱激情综合网 | 中文字幕影片免费在线观看 | 国产一级h | 天操夜夜操 | 天堂av免费 | 精品久久久久久久久久久久久久久久久久 | 久久伊人精品一区二区三区 | 欧美看片 | 丁香花在线视频观看免费 | 成人18视频 | 欧美作爱视频 | 中文字幕网址 | 九九热中文字幕 | 久久激情精品 | 国产成人精品久久久久 | 黄网站app在线观看免费视频 | 国产亚洲亚洲 | 国产原创在线 | 在线黄色国产电影 | 波多野结衣电影一区 | 国产美女精品视频 | 美女网站色免费 | 日日色综合 | 91精品在线播放 | 91av资源网 | 天天av资源 | 在线观看色网 | 国产在线观看高清视频 | 免费视频久久 | 青青河边草免费观看完整版高清 | 久久曰视频| 欧美大香线蕉线伊人久久 | 一区二区精品视频 | 亚洲综合一区二区精品导航 | 欧美亚洲精品在线观看 | 国产欧美综合视频 | 日韩av在线小说 | 麻豆视频免费入口 | 亚洲午夜电影网 | 97成人在线观看 | 中文在线a√在线 | 免费av看片 | 国产精品久久久久久久久久白浆 | 91高清一区 | 人人干人人上 | 69精品视频在线观看 | 天堂黄色片| www178ccom视频在线 | 久草精品视频 | 在线观看亚洲免费视频 | 久久99精品久久久久久清纯直播 | 一区二区三区免费播放 | 国产一区二区高清不卡 | 欧美精品v国产精品v日韩精品 | 日本中文乱码卡一卡二新区 | 日韩va欧美va亚洲va久久 | 精品在线观看视频 | 日韩av一卡二卡三卡 | 日韩精品久久久久 | 中文字幕视频一区二区 | 亚洲国产精品va在线看 | 国产a精品| 成年人在线观看视频免费 | 国产最新在线观看 | 久久激情小视频 | 国产精品99久久久久久有的能看 | 日韩色综合 | 免费黄色在线网站 | 国产一区二区久久精品 | 一级黄视频 | 久久精品成人 | 国产精品视频99 | 亚欧日韩av | 中文字幕 91 | 狠狠狠狠狠狠狠干 | 亚洲精品玖玖玖av在线看 | 青青河边草免费观看 | 日韩一区二区在线免费观看 | 在线观看欧美成人 | 五月激情六月丁香 | 免费在线观看成人 | 精品免费久久久久 | 精品自拍sae8—视频 | 欧洲高潮三级做爰 | 性色大片在线观看 | 国产黄色电影 | 日本资源中文字幕在线 | 国产啊v在线 | 人人添人人澡 | 深爱激情五月综合 | 99久久久国产精品 | 中文十次啦 | 亚洲涩涩一区 | 九九九九免费视频 | 国产视频1| 久久精品小视频 | 欧美aaa一级| 国产精品18久久久久久久久久久久 | 久久国产网站 | 天天躁日日躁狠狠躁 | 日韩激情在线视频 | 久久精品超碰 | 97精品电影院 | 黄色的网站免费看 | 亚洲aⅴ免费在线观看 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 91资源在线观看 | 免费成人黄色 | 亚洲影视九九影院在线观看 | 99在线热播| 免费下载高清毛片 | 少妇视频在线播放 | 久草在线综合网 | 免费久久网 | 成人国产精品免费 | 天天射夜夜爽 | 免费在线观看成人av | 在线观看91av | 91在线小视频 | 91精品视频一区二区三区 | 国产第一页在线播放 | 91成人精品视频 | 中文字幕色综合网 | 久av电影 | 狠狠操在线 | 综合av在线 | 国产美女被啪进深处喷白浆视频 | av免费网站在线观看 | 欧美成人播放 | 美女网站视频久久 | 天天操婷婷 | 日韩欧美一区二区三区免费观看 | 婷婷在线色| 久久国产精品久久国产精品 | 在线播放91 | 香蕉视频免费看 | 探花视频在线观看+在线播放 | 国产一级片一区二区三区 | 在线免费观看视频一区 | 国产麻豆精品久久一二三 | 日韩视频一区二区在线观看 | 日韩av网址在线 | 久久精品国产亚洲a | 一区二区三区久久精品 | 中文电影网 | 亚洲成a人片在线观看网站口工 | 五月天精品视频 | 国产一线天在线观看 | 国产视频久 | 少妇视频一区 | 精品99999| 在线免费观看欧美日韩 | 天天射天天干天天插 | 91在线视频精品 | 97国产精品久久 | 99久久精品免费 | 91视频高清完整版 | 日韩在线免费视频 | 欧美日韩中字 | 亚洲精品国产精品99久久 | 91漂亮少妇露脸在线播放 | 亚洲影院天堂 | 久久久久久久久黄色 | 久久国产午夜精品理论片最新版本 | 国产亚洲免费观看 | 国产一级特黄毛片在线毛片 | 日韩视频1 | 手机av在线网站 | 欧洲一区二区三区精品 | 免费看的黄色片 | 国产99久久久国产精品免费二区 | 精品无人国产偷自产在线 | 成人在线观看网址 | 一级电影免费在线观看 | 四虎影视精品 | www黄com| 丁香花在线视频观看免费 | 午夜精品电影一区二区在线 | 最新av网址在线观看 | 婷婷成人在线 | 中文字幕在线观看不卡 | a成人v在线 | 波多野结衣亚洲一区二区 | 国产高h视频 | 久久理论电影 | 91精品国产福利在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 日韩视频免费 | 狠狠伊人| 色综合亚洲精品激情狠狠 | 开心激情五月网 | 成人在线免费看视频 | 久久天天躁狠狠躁亚洲综合公司 | 亚洲精品免费看 | 天天射日 | 日韩精品一区二区三区在线播放 | 免费日韩 | 天天躁日日躁狠狠躁av麻豆 | 美女视频久久久 | 1000部18岁以下禁看视频 | 亚洲无线视频 | 激情伊人五月天 | 99热这里只有精品8 久久综合毛片 | 色999视频| 久久久国际精品 | 国产精品美女久久久久aⅴ 干干夜夜 | 日本精品中文字幕在线观看 | 国产精品区二区三区日本 | 国产日韩精品一区二区三区在线 | 狠狠艹夜夜干 | 精品亚洲成人 | 久草网视频在线观看 | 97精品国产97久久久久久久久久久久 | 日韩在线免费高清视频 | 色视频在线 | 中文字幕视频三区 | 久久av高清 | 波多野结衣电影一区二区三区 | 婷婷深爱五月 | 国产精品av久久久久久无 | 一级片黄色片网站 | 黄色av免费看 | 日日草av| 国产一区二区在线看 | 日日夜操 | 一区二区精品视频 | 在线播放国产一区二区三区 | 久久成人国产精品一区二区 | 人人爽久久久噜噜噜电影 | 日日夜夜天天操 | 久久久久国产精品视频 | 日韩性片 | 国产成人精品一区二区三区 | 亚洲国产影院 | 国产91免费观看 | 国产精品18久久久久白浆 | 在线97| 久久久精品福利视频 | 在线观看视频91 | 国产一级电影网 | 中文字幕在 | 成人一区二区三区在线 | 99久久精品费精品 | 天天干天天干天天干 | 欧美一区二区三区激情视频 | 国产 日韩 欧美 中文 在线播放 | 色婷婷视频在线 | av在线观| 91av在线视频免费观看 | 91精品视频在线看 | 久久y| 欧美十八| 久草视频看看 | 91精品视频免费观看 | 成人a免费 | 色偷偷人人澡久久超碰69 | 男女啪啪网站 | 亚洲人久久 | 91视频xxxx| 97成人在线视频 | 男女激情网址 | 狠狠色丁香婷婷综合最新地址 | 91免费高清观看 | 在线观看精品国产 | 日日夜夜天天 | 国产在线欧美 | 久久精品高清 | 天天操人人干 | 日韩在线免费电影 | 黄色a一级片 | 久久久久久麻豆 | 国产精品自产拍在线观看网站 | 免费视频一区 | 在线观看中文 | 日韩天堂网 | 国产精品嫩草影院9 | 久久久久成人免费 | 久久久久国产精品一区二区 | 亚洲精品成人在线 | 日韩理论在线 | 美女黄久久 | 国产精品久久久av | 亚洲激情 欧美激情 | 久久视频国产 | 99福利影院 | 国产美女视频免费观看的网站 | 国产一区视频在线 | 国产一级特黄毛片在线毛片 | 日韩美在线观看 | 99产精品成人啪免费网站 | 五月花丁香婷婷 | 午夜影院三级 | 91香蕉视频色版 | 国产香蕉av | .精品久久久麻豆国产精品 亚洲va欧美 | 亚洲日韩欧美一区二区在线 | 国产一级黄色片免费看 | 1024久久 | 中文在线天堂资源 | 一本一本久久a久久 | 91手机电影 | 欧美污网站 | 美女免费视频一区 | 国产91免费看 | 国产成人免费在线观看 | 中文电影网 | 亚洲黄色在线观看 | 激情伊人五月天久久综合 | 久久不卡视频 | 久久免费福利视频 | 国产五码一区 | 亚洲第一中文网 | 国产福利av在线 | 亚洲激色| 丁香五月网久久综合 | 国产91国语对白在线 | 久久涩视频 | 97超在线 | 久操视频在线免费看 | 色99久久 | 99精品99 | a色网站| 成人h视频 | 国产91aaa| 中文字幕在线播放日韩 | 天天插天天爽 | 97干com| 久久艹人人 | 国产韩国日本高清视频 | 婷婷爱五月天 |