使用scrapy爬取手機版鬥魚主播的房間圖片及暱稱

來源:互聯網
上載者:User

標籤:fiddler   pid   連結   代理   \n   print   callback   request   code   

目的:通過fiddler在電腦上對手機版鬥魚主播進行抓包,爬取所有主播的暱稱和圖片連結

關於使用fiddler抓取手機包的設定:

把手機和裝有fiddler的電腦處在同一個網段(同一個wifi),手機串連好wifi後,點擊手機wifi的串連,把代理改為手動,主機地址設定為fiddler所在的電腦ip,連接埠號碼為8888(fiddler預設使用的連接埠號碼),就可以對手機進行抓包

1 建立爬蟲項目douyumeinv

scrapy startproject douyumeinv

2 設定items.py檔案,對要爬取資料設定欄位名字及類型進行儲存

# -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# https://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DouyumeinvItem(scrapy.Item):      # 主播暱稱    nickname = scrapy.Field()    # 主播房間的圖片連結    roomSrc = scrapy.Field()    # 照片在本地儲存的位置    imagesPath = scrapy.Field()

3 在spiders檔案夾內建立爬蟲檔案douyuspider.py,代碼如下

# -*- coding: utf-8 -*-import scrapyfrom douyumeinv.items import DouyumeinvItemimport jsonclass DouyuSpider(scrapy.Spider):    # 爬蟲名字,終端執行命令時使用。如scrapy crawl douyu    name = ‘douyu‘    # 指定爬取的域範圍    allowed_domains = [‘douyu.com‘]    # 要爬取的頁碼    num = 1    # 主播個數    n = 0    # 實際有主播的頁碼    pageCount = 0    url = ‘https://m.douyu.com/api/room/mixList?page=‘ + str(num) + ‘&type=qmxx‘    # 爬取的url列表    start_urls = [url]    def parse(self, response):        ‘‘‘解析函數‘‘‘        # 把擷取的json資料轉換為python字典        data = json.loads(response.text)[‘data‘]        # 擷取實際具有主播的頁碼        self.pageCount = int(data[‘pageCount‘])        for each in data[‘list‘]:            self.n += 1            item = DouyumeinvItem()            # 主播房間圖片連結            item[‘roomSrc‘] = each[‘roomSrc‘].encode(‘utf-8‘)            # 主播暱稱            item[‘nickname‘] = each[‘nickname‘].encode(‘utf-8‘)            # print(item)            # 返回資料給管道            yield item    # 重新發送請求        self.num += 1    # 只對有主播的頁碼,進行發送請求    if self.num <= self.pageCount:        self.url = ‘https://m.douyu.com/api/room/mixList?page=‘ + str(self.num) + ‘&type=qmxx‘        yield scrapy.Request(self.url, callback=self.parse)    print ‘\n已爬完第%d頁,共%d頁,共爬取%d個主播\n‘%(self.num - 1,self.pageCount,self.n)

4 設定pipelines.py管道檔案,利用images.ImagesPipeline類來請求圖片連結並處理下載好的圖片

# -*- coding: utf-8 -*-# Define your item pipelines here## Don‘t forget to add your pipeline to the ITEM_PIPELINES setting# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html# class DouyumeinvPipeline(object):    # def process_item(self, item, spider):    #     return itemimport scrapyfrom scrapy.pipelines import imagesfrom scrapy.utils.project import get_project_settingsimport osclass DouyumeinvPipeline(object):    def process_item(self, item, spider):        return itemclass ImagesPipeline(images.ImagesPipeline):    images_store = get_project_settings().get(‘IMAGES_STORE‘)    # count用來統計實際下載並改名成功的圖片個數    count = 0    def get_media_requests(self, item, info):        ‘‘‘        get_media_requests的作用就是為每一個圖片連結產生一個Request對象,這個方法的輸出將作為item_completed的輸入中的results        ‘‘‘        # return [Request(x) for x in item.get(self.images_urls_field, [])]        image_url = item[‘roomSrc‘]        # print(‘=‘*60)        # print(image_url)        # print(item[‘nickname‘])        # print(‘=‘*60)                yield scrapy.Request(image_url)    def item_completed(self, results, item, info):              # results是一個元組,每個元組包括(success, imageinfoorfailure)。        # 如果success=true,imageinfoor_failure是一個字典,包括url/path/checksum三個key。              image_path = [x["path"] for ok,x in results if ok]        # print(‘*‘*60)        # 由於yield的原因,image_path的值為每次輸出一個列表[‘full/0c1c1f78e7084f5e3b07fd1b0a066c6c49dd30e0.jpg‘]        # print(image_path[0])        # print(item[‘nickname‘])        # print(‘*‘*60)        # 此處發現,不用再建立相應的檔案夾,直接使用下面的字串拼接,就可以產生一個檔案夾        old_file = self.images_store + ‘/‘ + image_path[0]        new_file = self.images_store + ‘/full/‘ + item[‘nickname‘] + ‘.jpg‘        # print(‘\n‘  + ‘-‘*60)        # print(old_file)        # print(new_file)        # print(‘\n‘)        # print(os.path.exists(old_file))        # 判斷該檔案及路徑是否存在                # 如果圖片下載成功,則計數加1        if os.path.exists(old_file):            self.count += 1        # print(‘\n‘)        # print(‘-‘*60 + ‘\n‘)        os.rename(old_file,new_file)        item[‘imagesPath‘] = self.images_store + ‘/full/‘ + item[‘nickname‘]        # print(os.listdir(‘/home/cc/pachong/2-scrapy架構/01.scrapy架構與Spider類/douyumeinv/douyumeinv/images/full/‘))        print(‘#‘*60)        print(‘已成功下載%d張圖片‘%(self.count))        print(‘#‘*60)        return item

5 設定settings.py檔案

6 測試結果如下:

使用scrapy爬取手機版鬥魚主播的房間圖片及暱稱

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.