抓取动态网页(前文Ajax理论AjaxAjaxAjaxAjax)

优采云 发布时间: 2022-02-01 17:06

  抓取动态网页(前文Ajax理论AjaxAjaxAjaxAjax)

  上面的爬虫都是基于静态网页的。首先通过请求网站url获取网页源代码。之后,可以提取和存储源代码。本文对动态网页采集进行数据处理。首先介绍了Ajax的理论,然后实际爬取flushflush的动态网页,获取个股的相关信息。

  

  一、Ajax 理论

  1.Ajax介绍

  Ajax 的全称是“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),它指的是一种用于创建交互式、快速和动态的 Web 应用程序的 Web 开发技术,可以在不重新加载整个网页的情况下更新某些网页。Ajax 可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。

  2.Ajax 分析

  微博网站是一个比较容易识别的Ajax动态网页。首先打开Dectools工具(转到XHR专栏)和中南财经政法大学官方微博网站(),这里选择。是手机微博,然后选择清除所有内容。

  

  接下来,滚动滚轮以下拉页面,直到一个新项目出现在空的 XHR 列中。点击项目,选择预览栏,发现这里对应的内容就是页面上的新微博。但它没有改变。至此,我们可以确定这是一个Ajax请求后的网页。

  

  3.Ajax 提取

  或者选择同一个条目进入Headers进一步查看信息,可以发现这是一个GET类型的请求,请求的url为:,即请求有四个参数:type、value、containerid、since_id和然后翻页发现除了since_id的变化之外,其余保持不变,这里我们可以看到since_id就是翻页方法。

  

  接下来进一步观察since_id,发现上下请求的since_id之间没有明显的规律。进一步搜索发现,下一页的since_id在上一页的响应中的cardListInfo中,因此可以建立循环连接,进一步将动态url循环添加到爬虫中。

  

  

  发起请求并得到响应后,可以进一步分析出响应格式是json,所以可以通过对json的进一步处理得到最终的数据!

  二、网页分析

  1.网站概览

  经过以上分析,我们将用flush网页的数据来采集实战进行例子验证。首先打开网页:,如下图:

  

  再按F12键打开Devtools后台源码,右键第一项查看源码位置。

  

  2.阿贾克斯歧视

  接下来,通过点击网页底部的下一页,我们发现网页的url并没有改变!至此,基本可以确定该网页属于Ajax动态网页。

  

  

  进一步,我们清空Network中的所有内容,继续点击下一页到第五页,发现连续弹出三个同名的内容,就可以得到请求的url和请求头的具体内容通过一般栏。

  

  所以我们复制这个请求url,在浏览器中打开,响应内容确实是标准化的表格数据,正是我们想要的。

  

  3.Ajax 提取

  然后我们也打开源码,发现是一个html文档,说明响应内容是网页的形式,和上面微博响应的json格式不同,所以数据可以在稍后解析网页的形式。

  

  三、爬行者战斗

  1.网页访问

  在第一部分的理论介绍和第二部分的网页分析之后,我们就可以开始编写爬虫代码了。首先,导入库并定义请求头。需要注意的是,这里的请求头除了User-Agent外,还需要host、Referer和X-Requested-With参数,这要和静态网页爬取区别开来。

  # 导入库import timeimport jsonimport randomimport requestsimport pandas as pdfrom bs4 import BeautifulSoup​headers = { 'host':'q.10jqka.com.cn', 'Referer':'http://q.10jqka.com.cn/', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3554.0 Safari/537.36', 'X-Requested-With':'XMLHttpRequest'}url = 'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/%s/ajax/1/' % page_idres = requests.get(url,headers=headers)res.encoding = 'GBK'

  2.信息提取

  之后就是上面解析库中的内容,这里使用BaetifulSoup库,方便理解。先将上面的html转换成BeautifulSoup对象,然后通过对象的select选择器选择响应tr标签中的数据,进一步分析每个tr标签的内容,得到如下对应信息。

  # 获取单页数据def get_html(page_id): headers = { 'host':'q.10jqka.com.cn', 'Referer':'http://q.10jqka.com.cn/', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3554.0 Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } url = 'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/%s/ajax/1/' % page_id res = requests.get(url,headers=headers) res.encoding = 'GBK' soup = BeautifulSoup(res.text,'lxml') tr_list = soup.select('tbody tr') # print(tr_list) stocks = [] for each_tr in tr_list: td_list = each_tr.select('td') data = { '股票代码':td_list[1].text, '股票简称':td_list[2].text, '股票链接':each_tr.a['href'], '现价':td_list[3].text, '涨幅':td_list[4].text, '涨跌':td_list[5].text, '涨速':td_list[6].text, '换手':td_list[7].text, '量比':td_list[8].text, '振幅':td_list[9].text, '成交额':td_list[10].text, '流通股':td_list[11].text, '流通市值':td_list[12].text, '市盈率':td_list[13].text, } stocks.append(data) return stocks

  3.保存数据

  定义 write2excel 函数将数据保存到stocks.xlsx 文件中。

  # 保存数据def write2excel(result): json_result = json.dumps(result) with open('stocks.json','w') as f: f.write(json_result) with open('stocks.json','r') as f: data = f.read() data = json.loads(data) df = pd.DataFrame(data,columns=['股票代码','股票简称','股票链接','现价','涨幅','涨跌','涨速','换手','量比','振幅','成交额', '流通股','流通市值','市盈率']) df.to_excel('stocks.xlsx',index=False)

  4.循环结构

  考虑到flushflush的多页结构和反爬的存在,这里也采用了字符串拼接和循环结构来遍历多页股票信息。同时,随机库中的randint方法和时间库中的sleep方法在爬取前会中断一定时间。

  def get_pages(page_n): stocks_n = [] for page_id in range(1,page_n+1): page = get_html(page_id) stocks_n.extend(page) time.sleep(random.randint(1,10)) return stocks_n

  最终爬取结果如下:

  

  四、爬虫摘要

  至此,flush动态网页的爬取完成,再通过这个爬虫进行总结:首先,我们通过浏览网页结构和翻页,对比XHR bar,对页面进行Ajax判断。如果网页url没有变化,XHR会刷新内容,基本说明是动态的。这时候我们进一步检查多个页面之间url请求的异同,寻找规律。找到规则后,就可以建立多页面请求流程了。之后处理单个响应内容(详见响应内容格式),最后建立整个循环爬虫结构,自动爬取想要的信息。

  爬虫的完整代码可以在今日头条私信获取。下面将进一步解释和实践浏览器模拟行为。上篇文章涉及的基础知识,请参考以下链接:

  爬虫需要知道的基础知识,这一点就够了!Python网络爬虫实战系列

  本文将带你深入了解和学习Python爬虫库!从现在开始,不用担心数据

  Python爬虫有多简单?本文将带你实战豆瓣电影TOP250数据爬取!

  一篇搞懂Python网络爬虫解析库的文章!收录多个示例

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线