Selenium + Scrapy爬取某商標資料

weixin_34253539發表於2018-06-27

先談談用 Scrapy 框架爬取資料搭配使用 Selenium 的原因:
一般情況下我們使用 Scrapy 就可以完成所有爬取操作,但是爬取過程會遇到某些操作用程式碼實現非常複雜,比如我寫過的這篇部落格 Scrapy 模擬登入新版知乎 其中的 signature 引數的值,是在某個 js 中通過演算法加密生成的,很麻煩;但是我們不登入的話爬取的資料可能會不全面,,有沒有一種更好的辦法?答案是肯定的!那就是 Selenium,完全模擬人去操作瀏覽器;下面我通過在某商標網站模擬登入後爬取詳情資料為例告訴大家怎麼搭配使用 Selenium + Scrapy,本篇只介紹用法,預設已安裝了 Selenium 和 Scrapy

1、Selenium 模擬登入

    def start_requests(self):
        url = "https://account.quandashi.com/passport/login?callback=https%3A%2F%2Fwww.quandashi.com%2F"
        driver = webdriver.Chrome(executable_path='E:\Develop\chromedriver_win32\chromedriver.exe')  # 指定你安裝的 chromedriver 目錄,這兒使用的是Chrome, 當然你也可以換成 Firefox
        driver.get(url)
        time.sleep(5)  # 延時的原因是等網頁載入完畢再去獲取欄位
        driver.find_element_by_xpath('//*[@id="username"]').send_keys("使用者名稱")  # 使用者名稱輸入框
        driver.find_element_by_xpath('//input[@type="password"]').send_keys("密碼")  # 密碼輸入框
        driver.find_element_by_xpath('//*[@id="btn-login"]').click()  # 登入按鈕
        time.sleep(15)
        cookie = driver.get_cookies()  # 獲取登入後的 cookies
        yield scrapy.Request(url="https://so.quandashi.com/index/search?key=查詢關鍵字",
                             headers=self.headers, dont_filter=True, cookies=cookie, meta={"cookie": cookie})

以上操作是通過 Selenium 模擬登入後獲取到對應的 coookie,後面的每次請求都帶上該 cookie

2、Scrapy 請求資料

def parse(self, response):
     dl_nodes = response.xpath('//div[@class="searchLis-result"]/dl')
     cookie = response.meta.get("cookie", ""),獲取傳過來的 cookie 值
     for node in dl_nodes:
         detail_url = node.xpath('dt/span/a/@href').extract_first()  # xpath匹配規則,獲取詳情頁的 url
         yield scrapy.Request(url=urlparse.urljoin(response.url, detail_url), headers=self.headers, dont_filter=True,
                              cookies=cookie, meta={"cookie": cookie, "present_status": present_status},
                              callback=self.parse_detail)  # 每次請求都需要攜帶 cookie 值
def parse_detail(self, response):
     print(response.text)

新增 parse_detail 函式處理傳過來的詳情頁資料,列印會發現裡面就是詳情 url 所對應的詳情資料 完整的原始碼

總結

我們可以使用 Selenium 來程式碼一些程式碼實現起來很複雜的操作,當然上面的例子沒有進行適合的封裝,僅僅是介紹了 Selenium + Scrapy 的用法,比如 Scrapy 所有的 url 下載操作都會經過中介軟體 DownloaderMiddleware,因此我們可以將 cookie 下載到本地,然後在中介軟體給 request 的每個 url 加上 cookie,這樣程式碼可讀性更好,而且程式碼更嚴謹

相關文章