docker+scrapy+scrapy_splash爬取大麥網

背景

今天拿到個代碼需要改改,他是用scrapy爬取大麥網,然後我改了將近一個小時還是得不到內容,第一是太久沒用scrapy寫爬蟲,其次也是因爲當時思路太死板,忘了一些重要的細節問題,所以導致一直改不好代碼。然後點了個外賣,繼續想這個問題。

開始

起初

一開始我還是自己重新搭了一個scrapy的基本框架出來,還是那兩句代碼
scrapy startproject 項目名生成一個項目
scrapy genspider 爬蟲名 網址生成爬蟲,需要自己編寫解析函數
然後開始寫解析函數以及配置setting中相關的設置
但是運行會發現沒有結果返回,查看運行日誌發現成功請求到網頁,但是得不到相關的信息。用print打印css選擇的內容發現返回的內容是[],也就是沒有得到內容。

思考

第一反應是不應該啊,明明網頁都是正常請求到的,怎麼會得不到信息呢?
想了一會,然後仔細看了一下請求得到的網頁內容,發現關於門票那些內容並沒有,恍然大悟。這不就是動態網頁嗎?然後去看了一下,果然就發現了js渲染的內容
在這裏插入圖片描述
在這裏插入圖片描述
一般這種情況我都是直接requests訪問這個網頁,然後解析出數據就好,但是今天我和scrapy槓上了,難道scrapy就不能爬取動態網頁了嗎?然後我嘗試了用selenium去請求網頁,這樣就可以得到網頁內容,但是返回的信息和scrapy框架本身的css、xpath選擇器兼容性太差,那還不如直接請求用beautifulsoup或者lxml解析。然後去百度了一番,發現了scrapy_splash這個庫,於是開始動手嘗試。

動手

安裝scrapy_splash並不難,pip install scrapy_splash就行,但是需要下載docker,因爲scrapy_splash必須在docker中使用。

下載並配置docker

去官網下載docker,然後安裝。這沒什麼難度,安裝好之後需要重啓一次電腦。然後就是配置鏡像源,不然的話拉取鏡像會失敗的。去阿里雲弄一個鏡像加速器,然後配置到docker的setting中
關於配置鏡像加速器的博客
在這裏插入圖片描述
然後apply,重啓docker

拉取鏡像並啓動

拉取鏡像
docker pull scrapinghub/splash
啓動
docker run -p 8050:8050 scrapinghub/splash
在這裏插入圖片描述
在這裏插入圖片描述
輸入地址去render一下,如果得到了完整的頁面就說明渲染成功,那我們就可以使用scrapy爬取了
在這裏插入圖片描述
已經得到了我們想要的內容,所以直接爬取就好

爬取網頁

spider.py

import scrapy
from damai.items import DamaiItem
from scrapy_splash import SplashRequest

class SpiderSpider(scrapy.Spider):
    name = 'spider'
    start_urls = ['https://www.damai.cn/']

    def start_requests(self):
        splah_args = {
            "lua_source": """
                function main(splash, args)
                  assert(splash:go(args.url))
                  assert(splash:wait(3))
                  return {
                    html = splash:html(),
                    png = splash:png(),
                    har = splash:har(),
                  }
                end
                """
        }

        start_url = 'https://www.damai.cn/'
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
        }

        yield SplashRequest(url=start_url, callback=self.parse, args={'wait': 1.0},headers=headers)


    def parse(self, response):
        #print(response.text)
        item = DamaiItem()
        info=response.css('.iteminfo')
        #print(info)
        for i in info:
            item['title']=i.css('.title::text').extract_first()
            item['address']=i.css('.venue::text').extract_first()
            item['showtime']=i.css('.showtime::text').extract_first()
            item['price']=i.css('.price::text').extract_first()
            yield item

另外的配置我就貼圖啦,代碼量很少
在這裏插入圖片描述
在這裏插入圖片描述
至於setting就自己去配置啦,這個也簡單

爬取結果

在這裏插入圖片描述
總算是都爬下來了,睡覺去了。

總結

太久不敲代碼真的會生疏,明明一個動態網頁的問題居然第一時間沒反應過來,花了幾個小時做這個簡單的不爲了別的,起碼對於不懂得或者遺忘的東西應該立馬回顧一下,老說溫故而知新,這不以後動態網頁用scrapy爬取的套路我也會了嘛。也希望那個同學也能看到這個博客吧,昨天沒幫到忙挺不好意思的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章