网页抓取数据(选择network,库需要对数据的格式有什么作用?)

优采云 发布时间: 2022-01-23 17:05

  网页抓取数据(选择network,库需要对数据的格式有什么作用?)

  初步准备工作

  本例使用了python爬虫所需的两个基础库,一个是requests库,一个是BeautifulSoup库。这里假设这两个库已经安装好了,如果没有,可以通过pip安装。接下来,简单说一下这两个库的作用。requests库的主要作用是通过url获取服务器的前端代码数据。这两个库捕获的数据是服务器前端代码中的数据。BeautifulSoup 库主要用于从捕获的前端代码中提取所需的信息。

  数据抓取

  这次抓到的数据的url是#hs_a_board

  推荐使用谷歌或火狐浏览器打开,可以使用快捷键CTRL+U查看服务器网页源代码。在捕获数据之前,您需要对数据的格式有一个大致的了解。首先,要捕获的数据必须在要直接捕获的源代码中找到。相信你能理解一点html语言基础知识。需要注意的是,我们可以在源码中看到script标签,因为JavaScript是在网页加载的时候动态加载的,所以我们抓取的源码也是显示出来的。它是 JavaScript 代码,而不是 JavaScript 加载的数据。所以我们在源码中是看不到*敏*感*词*的。所以如果我们直接抓取requests库返回的code数据,是无法抓取股票信息的。

  

  解决方案

  一个特殊的方法是不直接从目标网站抓取数据,而是找到PC发送的请求,改变get方法的参数,在新窗口中打开请求的资源。服务器可以通过改变请求参数返回不同的数据。这种方法需要对HTTP协议等原理有所了解。

  具体方法是在要抓取的数据上右击,选择inspect。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

  

  可以看出都是结构化数据,我们可以直接取数据。您可以使用正则表达式来匹配相应的数据。我们第一次只能捕获简单的信息,例如股票代码。详细的交易信息需要使用'+'股票代码'来获取。我们也用这两个库来重复这个过程,直接从源码中抓取就可以了,不用再麻烦了。代码直接在下面

  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人工客服


线