条件:有一批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数据库中