前段时间出于任务需要,需要爬取上证50指数成分股在某些日期内的新闻数量。
一开始的想法是爬百度新闻高级搜索,但是后来某一天百度新闻高级搜索突然用不了,无论搜索什么都会跳转到百度主页,至今(2020.06.11)没有恢复,不知道是不是百度公司把这个业务停掉了。
于是只能找替代品了,博主盯上了中国新闻高级搜索,号称是搜索界的国家队。
欲爬虫,首先得解析网页url结构。
首先以全文搜索关键词“工商银行”为例,设置搜索起点2020-01-08,终点2020-01-08,即搜索2020年1月8日这一天关键词“工商银行”的新闻量,点此进入网页。 主页如下: 其中,新闻总量便是我们期望爬取的数据,而搜索关键词和搜索时间区间是我们在爬虫过程中需要改变的变量。
接着分析其url:http://news.chinaso.com/newssearch.htm?q=%E5%B7%A5%E5%95%86%E9%93%B6%E8%A1%8C&startTime=20200108&endTime=20200108
在这一串url中,前面的http://news.chinaso.com/newssearch.htm?部分代表的是国搜主页,爬虫过程中不需要改动;余下部分则由三个变量构成:q、startTime、endTime。变量q的含义为搜索关键词,在这个url中“%E5%B7%A5%E5%95%86%E9%93%B6%E8%A1%8C”即代表着关键词“工商银行”;变量startTime和endTime即代表着时间起点和终点。
在实际操作过程中,url编码太过繁琐复杂,可直接用中文文本代替,例如,我想搜索2020年1月8日这一天关键词“中国平安”的新闻量,可以如下方式构造url:http://news.chinaso.com/newssearch.htm?q=中国平安&startTime=20200108&endTime=20200108。
对于希望爬取到的数据新闻总量,首先利用F12开发人员工具对其进行定位: 找到其节点后便可解析新闻量,方法有很多,包括bs、正则等,在这里博主使用正则语句:
到这里,爬虫最基本的部分就完成了,余下一些头尾部分细节需要处理。
一开始就说了需要爬取上证50成分股的股票,那首先需要知道成分股有哪些吧。博主了解到一支指数的成分股不是固定的,由于需要爬取的时间周期较长(一年以上),比较稳妥的做法是对于爬取的每个日期都请求一次成分股名单再进行爬取。在这里博主使用了聚宽平台提供的jqdatasdk数据包。首次使用需在官网注册账号并且在命令行中输入安装。
在使用过程中,首先需要登录:
接着便可获取历史行情数据:
从中便可解析出每日的成分股列表,用于循环爬取。
在实际操作中发现国搜对于爬虫还是比较严格的(不愧是国家队),需要使用代理ip,具体的ip平台这里不赘述,避免被当作广告,只提一下使用代理ip的方法。
首先构建ip池,从ip提供方复制下可用ip及其端口(当然也可接入其接口)
对每次爬虫,从ip池中随机挑选一个ip用于伪装。
所有的技术难点都分析完了,接下来直接放上完整代码,博主应用模块请求html:
这次项目规模不算小,但是要解决的技术难点均为爬虫的基本问题,所以整体难度不算太高。在这次项目中博主算是首次完整地应用了所学的爬虫知识,包括数据获取,网页解析,ip欺骗,数据清洗等。也算是对自己的一次锻炼。