天天看點

【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件

先送上傳送門,scrapy中文網,畫風清奇的使用說明網站:http://www.scrapyd.cn/doc/139.html

安裝完python就可以一鍵安裝scrapy了

pip3 install scrapy
           

建立一個項目

scrapy startproject stock
           

看到如下輸出:

You can start your first spider with:
    cd stock
    scrapy genspider example example.com
           

裝了PYCHARM或者别的python開發工具的童鞋就可以在PYCHARM裡面找到對應路徑打開這個項目了(file->open…->打開檔案夾)。scrapy已經自動建立了項目架構:

【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件

第一步在spiders檔案夾下面建立一個py檔案,

stock_spider.py

【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件
scrapy的規則

A:首先我們需要建立一個類,并繼承scrapy的一個子類:scrapy.Spider 或者是其他蜘蛛類型,後面會說到,除了Spider還有很多牛X的蜘蛛類型;

B:然後定義一個蜘蛛名,name=“” 後面我們運作的話需要用到;

C:定義我們需要爬取的網址,沒有網址蜘蛛腫麼爬,是以這是必須滴;

D:繼承scrapy的一個方法:start_requests(self),這個方法的作用就是通過上面定義的連結去爬取頁面,簡單了解就是下載下傳頁面。

我們從東方财富網下載下傳股票清單

先簡單的儲存HTML下來看看

'''
這是主程式
'''
import scrapy


class StockSpider(scrapy.Spider):
	name = 'stock_spider'

	def start_requests(self):
		# 東方财富網擷取股票清單

		urls = [
			'http://quote.eastmoney.com/center/gridlist.html#hs_a_board',
		]
		headers = {
			'Referer': 'http://quote.eastmoney.com',
			'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
		}

		for url in urls:
			yield scrapy.Request(url=url, headers=headers, callback=self.parse)

	def parse(self,response):
		filename = 'stock_file'
		with open(filename,'wb') as f:
			f.write(response.body)
		self.log('save file %s' % filename)

           

在項目中就有了如下檔案:

【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件

打開一看:

<div class="listview full">
        <table id="table_wrapper-table" class="table_wrapper-table"><thead></thead><tbody></tbody></table>`
           
【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件

我們最需要的

<tbody>

标簽裡什麼都沒有,喪心

這個時候需要使用

selenium

作為中間件,當中遇到一點小問題,傳送門:

import selenium失敗的解決方案

打開項目中

middlewares.py

輸入如下代碼:

這裡用到了chromedriver配置傳送門:

https://blog.csdn.net/ywj_486/article/details/80940087
from scrapy import signals
import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time


class StockMiddleware(object):
    def process_request(self, request, spider):
        
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')

        self.driver = webdriver.Chrome(chrome_options=chrome_options, executable_path='/Users/yaochenli/stock/stock/chromedriver')
        
        self.driver.get(request.url)
        time.sleep(3)
        
        html = self.driver.page_source
        self.driver.quit()
    
        return scrapy.http.HtmlResponse(request.url, body=html.encode('utf-8'), encoding='utf-8', request=request)


           

再打開

settings.py

先将robotstxt_obey改成false

【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件

再打開DOWNLOADER_MIDDLEWARES 将中間的類名改成我們剛剛添加的類名

【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件

全部儲存好

scrapy crawl stock_spider
           

再打開檔案看

【爬蟲】scrapy下載下傳股票清單(一)——對接selenium中間件

可以看到我們要的

<tbody>

的内容已經有了

先到這裡。