前文的爬虫都树立在静态网页根底之上,首要经过恳求网站url获取到网页源代码。之后对源代码进行信息提取从而存储即可,本文则针对动态网页进行数据收集,首要介绍Ajax相关理论,之后实战爬取同花顺动态网页,获取个股相关信息。
1.Ajax简介
Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创立交互式、快速动态网页使用的网页开发技能,无需从头加载整个网页的情况下,能够更新部分网页的技能。经过在后台与服务器进行少数数据交换,Ajax 能够使网页完结异步更新。这意味着能够在不从头加载整个网页的情况下,对网页的某部分进行更新。
2.Ajax剖析
微博网站便是一个比较简略辨认的带有Ajax的动态网页,首要翻开Dectools东西(调至XHR一栏)和中南财经政法大学的官微网站(https://m.weibo.cn/u/1216903164),这儿选用的是移动端微博,之后挑选清空一切内容。
接下来翻滚滑轮将页面向下拉,直至清空的XHR一栏呈现新的item,点开这个item并挑选Preview栏即可发现这儿对应的相应内容即为页面新呈现的微博,而反观上方网页链接却没有变,此刻咱们即可断定这是一个经过Ajax恳求之后的网页。
3.Ajax提取
仍是挑选相同的条目进入Headers进一步检查信息,能够发现这是一个GET类型的恳求,恳求url为:https://m.weibo.cn/api/container/getIndex?type=uid&value=1216903164&containerid=1076031216903164&since_id=4479891116113956,即恳求的参数有四个:type、value、containerid、since_id,随后接着翻页发现除since_id改变外,其他都不改变,这儿可知since_id即为翻页办法。
接下来进一步调查since_id发现上下恳求之间的since_id无显着规则,进一步查找可知下一页的since_id在上一页呼应中的cardListInfo里,因而能够树立循环联络进一步将动态url循环加至爬虫里。
建议恳求获取呼应之后进一步剖析,可知呼应格局为json,因而进一步对json进行处理即可得终究数据!
二、网页剖析1.网页概览
有了上文剖析之后咱们将经过同花顺网页数据收集实战进行实例验证。首要翻开网页:http://q.10jqka.com.cn/,如下图:
进一步按F12键翻开Devtools后台源代码,鼠标放至榜首条目右键检查可展现出源代码中所在位置。
2.Ajax判别
接下来咱们经过点击网页下方的下一页,发现网页url没有发生任何改变!此刻根本能够断定此网页归于Ajax动态网页。
进一步咱们清空Network中一切内容,持续点击下一页至第五页,发现接连弹出三条Name相同内容,可经过General栏获取到恳求的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 stocks3.保存数据
界说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.循环结构
考虑到同花顺多页结构,一起存在反爬,此处相同选用字符串拼接和循环结构遍历多页股票信息,一起经过random库中randint办法和time库的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终究的爬取成果如下:
四、爬虫总结至此同花顺动态网页的爬取完结,再经过此爬虫总结一下:首要咱们经过阅读网页结构和翻页比照XHR栏对该页进行Ajax断定,假如网页url不变且XHR会改写内容则根本标明为动态网页,此刻咱们进一步检查多页间url恳求的异同并找寻规则,规则找到之后即可树立多页恳求流程。之后对独自一个呼应内容进行处理(详细看呼应内容的格局),最终树立起整个循环爬虫结构即可自动化爬取想要的信息。
爬虫完好代码能够在头条号中私信取得。下文将进一步对阅读器模仿行为进行解说和实战,前文触及的根底知识可参阅下面链接:
爬虫所要了解的根底知识,这一篇就够了!Python网络爬虫实战系列
一文带你深化了解并学会Python爬虫库!从此数据不必愁
Python爬虫有多简略?一文带你实战豆瓣电影TOP250数据爬取!
一文澄清Python网络爬虫解析库!内含多个实例解说