抓取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,最后通过这个请求地址找到想要的数据, 并对参数进行一些修改。您可以一次获得所需的所有数据。爬取过程中遇到了一些问题。在最后的爬取过程中,有些股票没有交易数据,这导致我在没有交易数据的情况下抓取这些股票时报告异常错误。最后,我添加了一个判断。当没有交易数据时,会显示“该股票暂时没有交易数据!”。这个设计过程的最终结果是很棒的。最大的收获是这方面经验的积累,更重要的是解决这个题目设计中每一道题的过程。对我以后面对各种问题也很有帮助和启发。最大的收获是这方面经验的积累,更重要的是解决这个题目设计中每一道题的过程。对我以后面对各种问题也很有帮助和启发。最大的收获是这方面经验的积累,更重要的是解决这个题目设计中每一道题的过程。对我以后面对各种问题也很有帮助和启发。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线