Scrapy筆記 4 ---- Scrapy + selenium

在第一個筆記中,我們在 https://news.qq.com/ 中看到了,進入瀏覽器中,按住F12 之後出現的網頁結構和網頁源碼並不一致,這樣會導致我們的網頁內容無法抓取。原因是我們看到的網頁是由JS 動態生成,解決這個的方法有很多,其中谷歌公司的 selenium 可以很輕鬆的幫助我們獲取到想要的數據。這裏我們重點說一下,如何把selenium 嵌入 scrapy , 從而使我們的功能更加強大。

需配置文件

	- scrapy.py (解析網頁文件)
	- middlewares.py
	- setting.py 

在集合這兩個框架的時候,我們已經確定在該網站內的網頁都是動態加載出來,所以就直接把調用 webdriver 的方法寫在這裏。

import scrapy
from selenium import webdriver
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher

class QqnSpider(scrapy.Spider):

    name = 'qqn'
    allowed_domains = ['news.qq.com']
    start_urls = ['http://news.qq.com/']


    def __init__(self):
        '''
        瀏覽器設置
        '''

        self.browser = webdriver.Chrome(executable_path='/home/happyling/yifwork/newss/nq/tool/chromedriver')

        super(QqnSpider,self).__init__()

        dispatcher.connect(self.spider_closed,signals.spider_closed)

    def spider_closed(self,spider):
        '''
        整個程序運行結束關閉瀏覽器
        :param spider:  
        :return: 
        '''
        print('close spider')

        self.browser.quit()


    def parse(self, response):


        article = response.xpath('//ul[@class="list"]//li[@class="item cf"]//div[@class="detail"]//text()').extract_first()

        print(article)
	
	
一會如果打印出來結果,說明程序已經達到了預期的效果


  • middlewares.py
    先看一下文件裏面本來就有那些東西
    在這裏插入圖片描述
    可見框架會自動生成一些文件,我們先不調用這些文件,自己加一個新類,如下
from scrapy.http import HtmlResponse


class JSPageMiddleware(object):

    def process_request(self, request, spider):
        '''

        方法中的參數一定不要改,因爲這個方法就是來處理request 請求

        :param request:
        :param spider:
        :return:  browser 解析過後的url, 得到的頁面給解析函數中的 def parse(self, response) 來處理

        '''
        #  如果是我們需要的項目名稱,就會把 spider 裏面的 request 帶過來
        if spider.name == 'qqn':
            print(request.url)
            # 這裏的 spider.browser 會調用我們在解析函數裏面寫的 webdriver
            spider.browser.get(request.url)

            time.sleep(2)

            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding='utf-8',
                                request=request)
  • settings.py
    大概55 行左右,加入配置

      DOWNLOADER_MIDDLEWARES = {
      	 # 'nq.middlewares.NqDownloaderMiddleware': 543,
      	   'nq.middlewares.JSPageMiddleware': 4
      	   }
    

這裏,就完成我們的工作了,運行一下試一試

		2018-12-27 17:05:52 [selenium.webdriver.remote.remote_connection] DEBUG: DELETE http://127.0.0.1:40656/session/2852c5b6491ef720294808f901da0ebf {"sessionId": "2852c5b6491ef720294808f901da0ebf"}
		武漢一雙層公交車撞上限高架被削頂 多名乘客受傷
		close spider
		2018-12-27 17:05:52 [urllib3.connectionpool] DEBUG: http://127.0.0.1:40656 "DELETE /session/2852c5b6491ef720294808f901da0ebf HTTP/1.1" 200 72

輸出了文章標題,且在程序結束的時候關閉了瀏覽器。

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