使用selenium爬取網頁,如何在scrapy shell中除錯響應
scrapy shell 使用方法
一般為了檢查 Spider 的解析過程,我們會進入 scrapy shell
,執行一些程式碼測試解析邏輯有沒有問題,比如看 CSS 選擇器有沒有寫錯。進入 shell
的方法如下:
$ scrapy shell example.com
2018-09-12 12:25:17 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-09-12 12:25:17 [scrapy.core.engine] INFO: Spider opened
2018-09-12 12:25:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://example.com> (referer: None)
[s] Available Scrapy objects:
[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s] crawler <scrapy.crawler.Crawler object at 0x101e0f9e8>
[s] item {}
[s] request <GET http://example.com>
[s] response <200 http://example.com>
[s] settings <scrapy.settings.Settings object at 0x102bf4780>
[s] spider <DefaultSpider 'default' at 0x102fbdcc0>
[s] Useful shortcuts:
[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s] fetch(req) Fetch a scrapy.Request and update local objects
[s] shelp() Shell help (print this help)
[s] view(response) View response in a browser
In [1]: print(response)
<200 http://example.com>
在 shell
中,提供了好幾個變數,最常用的就是 response
,它表示 HTTP 請求收到的響應。我們可以這樣測試:
In [7]: response.css('body div h1::text').extract_first()
問題
但是,如果我們的響應是通過 selenium
在瀏覽器渲染後返回的呢?這時我們直接進入 scrapy shell
是得不到瀏覽器渲染後的 response
的,得到的是 HTTP 請求後的 response
,沒有執行 JS 指令碼。
比如,我們爬取淘寶商品列表頁:
$ scrapy shell https://s.taobao.com/search?q=%E5%B0%8F%E7%B1%B38&s=44
進入 scrapy shell
In [6]: xpath = '//div[@id="mainsrp-itemlist"]//div[@class="items"][1]//div[contains(@class, "item")]'
In [7]: response.xpath(xpath)
Out[7]: []
直接進入 scrapy shell
,響應中的 HTML 沒有商品列表節點。
解決辦法
Google 搜 scrapy shell selenium
沒有找到合適的答案,在官方文件找到答案,我們可以在 spider
進入 scapy shell
,當 response
傳送給 spider
時,已經由 SeleniumDownloaderMiddlerware
(自己寫的中介軟體)渲染好,這時就商品列表已經在 response
的 HTML 中了,所以我們就可以測試 CSS 選擇器了。
# -*- coding: utf-8 -*-
from scrapy import Spider, Request
from scrapytaobao.items import ProductItem
class TaobaoSpider(Spider):
name = 'taobao'
allowed_domains = ['www.taobao.com']
base_url = 'https://s.taobao.com/search'
def start_requests(self):
...
def parse(self, response):
from scrapy.shell import inspect_response
inspect_response(response, self)
在 spider
解析方法中呼叫 inspect_response()
,傳入 response
和 spider
例項。然後我們執行爬蟲。
$ scrapy crawl taobao
2018-09-12 12:27:48 [selenium.webdriver.remote.remote_connection] DEBUG: Finished Request
2018-09-12 12:27:48 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://s.taobao.com/search?q=%E9%AD%85%E6%97%8F&s=44> (referer: None)
[s] Available Scrapy objects:
[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s] crawler <scrapy.crawler.Crawler object at 0x10a911a20>
[s] item {}
[s] request <GET https://s.taobao.com/search?q=%E9%AD%85%E6%97%8F&s=0>
[s] response <200 https://s.taobao.com/search?q=%E9%AD%85%E6%97%8F&s=0>
[s] settings <scrapy.settings.Settings object at 0x10b79b828>
[s] spider <TaobaoSpider 'taobao' at 0x10b8bf048>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] view(response) View response in a browser
In [1]:
當 scrapy
執行到請求回撥方法時(parse
),就會進入 scrapy shell
,我們檢查一下 response
的 HTML 中是否真的包含 JS 渲染的商品列表:
In [1]: xpath = '//div[@id="mainsrp-itemlist"]//div[@class="items"][1]//div[contains(@class, "item")]'
In [2]: response.xpath(xpath)
Out[2]:
[<Selector xpath='//div[@id="mainsrp-itemlist"]//div[@class="items"][1]//div[contains(@class, "item")]' data='<div class="item J_MouserOnverReq item-a'>,
<Selector xpath='//div[@id="mainsrp-itemlist"]//div[@class="items"][1]//div[contains(@class, "item")]' data='<div class="item J_MouserOnverReq " dat'>,
...]
可以看到我們已經獲取到商品列表了,解決了在 scrapy shell
中除錯瀏覽器渲染的響應問題。
相關文章
- Selenium + Scrapy爬取某商標資料
- zf_利用feapder中的selenium網頁爬取資料網頁
- scrapy在pychram中除錯除錯
- 使用 Scrapy 爬取股票程式碼
- Scrapy使用隨機User-Agent爬取網站隨機網站
- Scrapy框架的使用之Scrapy爬取新浪微博框架
- Python爬蟲教程-33-scrapy shell 的使用Python爬蟲
- 【爬蟲】專案篇-使用selenium爬取大魚潮汐網爬蟲
- 萬能除錯 | Python爬蟲Scrapy框架HTTP代理的配置與除錯除錯Python爬蟲框架HTTP
- python網路爬蟲--專案實戰--scrapy嵌入selenium,晶片廠級聯評論爬取(6)Python爬蟲晶片
- scrapy中的selenium
- 讓 scrapy 重複爬取同一個頁面
- selenium 是否能獲取網頁裡出現的提示資訊?(如圖)網頁
- 初識Scrapy框架+爬蟲實戰(7)-爬取鏈家網100頁租房資訊框架爬蟲
- scrapy 爬取空值
- 如何使用python進行網頁爬取?Python網頁
- 爬取網頁文章網頁
- [Python3網路爬蟲開發實戰] 7-動態渲染頁面爬取-4-使用Selenium爬取淘寶商品Python爬蟲
- 爬蟲——網頁爬取方法和網頁解析方法爬蟲網頁
- JAVA爬蟲使用Selenium自動翻頁Java爬蟲
- 一起學爬蟲——使用Beautiful Soup爬取網頁爬蟲網頁
- Python應用開發——爬取網頁圖片Python網頁
- [Python3網路爬蟲開發實戰] 7-動態渲染頁面爬取-1-Selenium的使用Python爬蟲
- node:爬蟲爬取網頁圖片爬蟲網頁
- python網路爬蟲(14)使用Scrapy搭建爬蟲框架Python爬蟲框架
- Scrapy框架爬取海量妹子圖框架
- ferret 爬取動態網頁網頁
- Puppeteer爬取網頁資料網頁
- 關於python爬取網頁Python網頁
- Scrapy爬取新浪微博移動版使用者首頁第一條微博
- 使用Scrapy爬取圖片入庫,並儲存在本地
- Scrapy框架的使用之Scrapy通用爬蟲框架爬蟲
- 移動端網頁除錯網頁除錯
- 網頁外部注入vConsole除錯網頁除錯
- Python爬蟲之路-selenium在爬蟲中的使用Python爬蟲
- 如何在vscode中除錯程式碼?VSCode除錯
- 只會用Selenium爬網頁?Appium爬App瞭解一下網頁APP
- scrapy 也能爬取妹子圖?(5)