雪球網爬取上市公司資訊(一):爬取上市公司代號
阿新 • • 發佈:2019-02-19
條件:有一批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資料庫中