雪球网爬取上市公司信息(一):爬取上市公司代号

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值