网页文章自动采集(前文Ajax理论AjaxAjaxAjaxAjax分析)

优采云 发布时间: 2022-01-27 08:19

  网页文章自动采集(前文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 time

import json

import random

import requests

import pandas as pd

from 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_id

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


线