在第一個筆記中,我們在 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
輸出了文章標題,且在程序結束的時候關閉了瀏覽器。