前期准备工作
在本例中使用的是python爬虫需要的两个基础的库,一个是requests库,另一个是BeautifulSoup库。在这里假设已经安装了这两个库,如果没有可以通过pip安装。接下来简单说一下两个库的作用,requests库的主要作用是通过url获取到服务器的前端代码数据,使用这两个库抓取的数据都是服务器的前端代码中的数据。而BeautifulSoup库主要用来从抓取到的前端代码中提取需要的信息。
数据抓取
本次抓取的数据的url为http://quote.eastmoney.com/center/gridlist.html#hs_a_board
建议使用谷歌或者火狐浏览器打开,可以使用快捷键CTRL+U查看服务器的网页源代码。在抓取数据之前需要对数据的格式有大概的了解,首先要抓取的数据必须是在源码中能找到的才能直接抓取到。相信有一点html语言基础的都能看懂个大概,要留意的是,我们可以在源码中看到script的标签,因为JavaScript是在网页加载时动态加载的,所以我们抓取到的源码也显示的是JavaScript的代码,而并非JavaScript加载出来的数据。所以我们在源码中是看不到股票的数据的。所以如果我们直接抓取requests库返回的代码数据,是抓取不到股票信息的。
解决方法
一种比较特殊的方法就是不直接从目标网站抓取数据,而是找到PC端发出的请求,更改get方法的参数在新的窗口打开请求的资源。通过更改请求参数可以让服务器返回不同的数据。这种方法需要对HTTP协议等原理有所了解。
具体方法是,在需要抓取的数据上右键选择检查,谷歌和火狐都是支持元素检查的。然后可以看到对应的数据在本地是存在的。选择network,选择下面的JS,然后刷新一次,就可以看到get方法的请求。
通过检查get方法得到的返回数据与前端页面对比,可以发现是一致的。可以直接选择右键鼠标在新的网页打开。但是此时返回的只有一部分数据,并非所有的数据,通过修改get方法的参数可以获取到所有的数据。在此处只修改了np=2即可,至于为什么修改这个参数这里不进一步讨论。修改后的请求如下:http://52.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112405554850877717066_1581422771754&pn=1&pz=20&po=1&np=2&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:13,m:0+t:80,m:1+t:2,m:1+t:23&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1581422771755
可以看到都是结构化的数据,我们直接进行数据抓取即可。可以利用正则表达式匹配对应的数据。我们第一次只能抓取到股票代码等简单的信息,详细的交易信息需要使用http://info.stcn.com/dc/stock/index.jsp?stockcode=’ + '股票代码’才能抓取到,我们同样使用这两个库重复这个过程就可以了,而且可以直接从源码中抓取到,不用再这么麻烦。下面直接上代码
import requests
from bs4 import BeautifulSoup
import re
finalCodeList = []
finalDealData = [['股票代码','今开','最高','最低','昨收','成交量','成交额','总市值','流通市值','振幅','换手率','市净率','市盈率',]]
def getHtmlText(url)