1. 程式人生 > >雪球網爬取上市公司資訊(一):爬取上市公司代號

雪球網爬取上市公司資訊(一):爬取上市公司代號

條件:有一批5g相關公司,只知道公司名字或是簡稱,不知道公司是否上市以及股票程式碼,需要爬取公司資訊。

網站:雪球網

思路:上傳關鍵字,爬取搜尋結果網頁,將有結果的公司資訊抓取下來並存入資料庫

1、在雪球網輸入公司名搜尋,發現返回3個結果,其中search.json?code是我想要的檔案

2、這個是雪球網的一個api,通過請求他可以獲取到股票程式碼及公司上市稱號等資訊,它的地址是上圖右則的REQUEST URL,結尾的code值為中文進行url編碼後的結果,因此分析可得我們的請求為https://xueqiu.com/stock/search.json,然後傳入code引數。但訪問結果全部為空,之後在headers中新增user-agent,referer等引數仍然不行,最後使用postman進行請求,發現是cookie的原因。此處要訪問這個api需要傳入cookie才能訪問,否則則會返回403。

3、樓主發現,進入首頁時可以獲取到伺服器發的cookie,於是這裡我們先對首頁進行一次請求,將response中的cookie傳入到下一次的請求中,終於可以訪問這個介面了

class StockInfo(scrapy.Spider):
    name = 'stock_info'
    unstock = open('unstock.txt', 'w')
    custom_settings = {
        'ITEM_PIPELINES':{'stock5g.pipelines.StockInfoPipeline': 300,}
    }

    def start_requests(self):
        #訪問首面,此處{'cookiejar':1}是開啟cookie記錄
        url = r'https://xueqiu.com'
        headers = {
            'Host': 'xueqiu.com',
        }
        yield scrapy.Request(url,headers=headers,meta={'cookiejar':1}) 

    def parse(self, response):
        #構造url,response.meta['cookiejar']是上次請求後返回的cookie
        cookies = response.headers.getlist(b'Set-Cookie')
        print(cookies)
        with open('companys.csv', 'r', encoding='gbk') as f:
            comps = list(csv.reader(f))
        for comp in comps:
            url = r'https://xueqiu.com/stock/search.json'
            referer = r'https://xueqiu.com/k?q=' + comp[0]
            headers = {
                'Host': 'xueqiu.com',
                'Referer': referer,
            }
            params = {
                'code': comp[0]
            }
            yield scrapy.FormRequest(url, headers=headers,formdata=params, 
                                meta={'cookiejar':response.meta['cookiejar'],'search':comp[0]}, callback=self.parse1)

4、在parse1中,response.text為一個json格式資料,需要用json模組進行轉換後處理資料,這樣一次完整的帶cookie請求完成

下期預告:將資料儲存到mysql資料庫中