抓取jsp网页源代码(选择network,库需要对数据的格式有什么作用?)
优采云 发布时间: 2021-11-30 19:09抓取jsp网页源代码(选择network,库需要对数据的格式有什么作用?)
前期准备工作
本例中用到了python爬虫所需的两个基础库,一个是requests库,一个是BeautifulSoup库。这里假设已经安装了这两个库,如果没有,可以通过pip安装。接下来简单说一下这两个库的功能。requests库的主要功能是通过url获取服务端的前端代码数据。使用这两个库捕获的数据就是服务器前端代码中的数据。BeautifulSoup 库主要用于从爬取的前端代码中提取需要的信息。
数据抓取
这次抓到的数据的url是#hs_a_board
建议使用谷歌或者火狐打开,可以使用快捷键CTRL+U查看服务器的网页源码。在捕获数据之前,您需要对数据的格式有一个大致的了解。首先,要捕获的数据必须在要直接捕获的源代码中找到。我相信有一点基本的html语言可以理解它。需要注意的是,我们在源码中可以看到script标签,因为JavaScript是在网页加载的时候动态加载的,所以我们抓取的源码中也显示的是JavaScript代码,而不是JavaScript加载的数据。所以我们在源码中是看不到*敏*感*词*的。所以如果我们直接抓取requests库返回的code数据,是无法抓取股票信息的。
解决方案
一个特殊的方法不是直接从目标网站中抓取数据,而是找到PC发送的请求,改变get方法的参数,在新窗口打开请求的资源。服务器可以通过改变请求参数来返回不同的数据。这种方法需要了解HTTP协议等原理。
具体方法是在需要抓取的数据上右击选择check。Google 和 Firefox 都支持元素检查。然后可以看到本地存在对应的数据。选择network,选择下面的JS,刷新一次就可以看到get方法的请求了。
通过查看get方法获取的返回数据与前端页面的对比,可以发现它们是一致的。您可以直接选择鼠标右键打开一个新的网页。但是,此时只返回了部分数据,而不是全部数据。所有的数据都可以通过修改get方法的参数来获取。这里只修改 np=2 。至于为什么要修改这个参数,这里不再赘述。修改后的请求如下::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&_=55
可以看出数据是结构化的,我们可以直接抓取数据。您可以使用正则表达式来匹配相应的数据。第一次,我们只能捕获股票代码等简单信息。需要使用“+”股票代码来获取详细的交易信息。我们也可以用这两个库来重复这个过程,直接从源码中Grabing就可以了,没必要那么麻烦。直接上下面的代码
import requests
from bs4 import BeautifulSoup
import re
finalCodeList = []
finalDealData = [['股票代码','今开','最高','最低','昨收','成交量','成交额','总市值','流通市值','振幅','换手率','市净率','市盈率',]]
def getHtmlText(url):
head={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0',
'Cookie': 'qgqp_b_id=54fe349b4e3056799d45a271cb903df3; st_si=24637404931419; st_pvi=32580036674154; st_sp=2019-11-12%2016%3A29%3A38; st_inirUrl=; st_sn=1; st_psi=2019111216485270-113200301321-3411409195; st_asi=delete'
}
try:
r = requests.get(url,timeout = 30,headers = head)
r.raise_for_status()
r.encoding = 'utf-8'
return r.text
except:
return ""
def getCodeList(htmltxt):
getSourceStr = str(htmltxt)
pattern = re.compile(r'.f12...\d{6}.')
listcode = pattern.findall(getSourceStr)
for code in listcode:
numPattern = re.compile(r'\d{6}')
finalCodeList.append(numPattern.findall(code)[0])
def getData(CodeList):
total = len(CodeList)
finished = int(0)
for code in CodeList:
finished = finished + 1
finishedco = (finished/total)*100
print("total : {0} finished : {1} completion : {2}%".format(total,finished,finishedco))
dealDataList = []
dataUrl = 'http://info.stcn.com/dc/stock/index.jsp?stockcode=' + code
dataHtml = getHtmlText(dataUrl)
soup = BeautifulSoup(dataHtml,"html.parser")
dealDataList.append(code)
for i in range(1,4):
classStr = 'sj_r_'+str(i)
divdata =soup.find_all('div',{'class':classStr})
if len(divdata) == 0:
dealDataList.append('该股票暂时没有交易数据!')
break
dealData = str(divdata[0])
dealPattern = re.compile(r'\d+.\d+[\u4e00-\u9fa5]|\d+.+.%|\d+.\d+')
listdeal = dealPattern.findall(dealData)
for j in range(0,4):
dealDataList.append(listdeal[j])
finalDealData.append(dealDataList)
def savaData(filename,finalData):
file = open(filename,'a+')
for i in range(len(finalData)):
if i == 0:
s = str(finalData[i]).replace('[','').replace(']','')
s = s.replace("'",'').replace(',',' \t')+'\n'
else:
s = str(finalData[i]).replace('[','').replace(']','')
s = s.replace("'",'').replace(',','\t')+'\n'
file.write(s)
file.close()
url = ' http://51.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112408349318807687469_1574045112932&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&_=1574045112933'
htmltxt = getHtmlText(url)
soup = BeautifulSoup(htmltxt,"html.parser")
getCodeList(soup)
recordfile = 'stockData.txt'
getData(finalCodeList)
savaData(recordfile,finalDealData)
至于头部信息,可以通过上述检查元素的方法获得。
我将获取的股票信息存储在一个txt文件中,并相应地调整了格式以便于查看。最终结果如下(上次抓取的数据信息)
概括
刚开始爬的时候,因为参考了书中的例子,一开始不知道这个话题要爬的网页是用JavaScript写的。抓取静态网页的一般方法是不抓取。的。我尝试了很多方法。一开始还以为是没有加Headers参数,但是加了之后还是不行。最后在网上查资料的时候,发现了一篇关于反爬虫文章的文章,里面解释了用JavaScript编写的URL是无法捕获的,并引用了两个对应的解决方案。一是使用dryscape库进行爬取,二是使用selenium库进行爬取。我先尝试了第一种方法,但是因为dryscape库不再维护,安装库时失败,所以我尝试了第二种方法,使用selenium库进行爬取。这种方法确实可以抓取到数据,但前提是只能用浏览器打开页面后才能抓取到。考虑到要爬取的页面太多,无法逐页爬取,所以又放弃了第二种方法。最后转而分析JavaScript数据是如何通过JavaScript脚本传输到网页前端的,最后发现JavaScript在页面加载时会有一个请求URL,最后通过这个请求地址找到想要的数据, 并对参数进行一些修改。您可以一次获得所需的所有数据。爬取过程中遇到了一些问题。在最后的爬取过程中,有些股票没有交易数据,这导致我在没有交易数据的情况下抓取这些股票时报告异常错误。最后,我添加了一个判断。当没有交易数据时,会显示“该股票暂时没有交易数据!”。这个设计过程的最终结果是很棒的。最大的收获是这方面经验的积累,更重要的是解决这个题目设计中每一道题的过程。对我以后面对各种问题也很有帮助和启发。最大的收获是这方面经验的积累,更重要的是解决这个题目设计中每一道题的过程。对我以后面对各种问题也很有帮助和启发。最大的收获是这方面经验的积累,更重要的是解决这个题目设计中每一道题的过程。对我以后面对各种问题也很有帮助和启发。