由于资金一览流向图是由网页动态加载的数据无法通过普通的requests模块获取,而通过selenium模块对动态数据的抓取更加便捷。
爬虫基本流程:对指定url发起请求,获取源码数据,解析数据
selenium模块 使用的流程环境安装:pip install selenium
下载浏览器的驱动程序:
http://npm.taobao.org/mirrors/chromedriver/
实例化一个浏览器对象:
from selenium import webdriver bro=webdriver.Chrome(executable_path='./chromedriver.exe')##返回一个浏览器对象
让浏览器对指定url发起一个请求
bro.get('https://data.eastmoney.com/zjlx/000036.html')
获取浏览当前页面的源码数据
page_text=bro.page_source通过xpath解析数据
通过selenium模块得到的页面源码数据通过xpath进行定位解析。
xpath数据解析流程环境安装:pip install lxml
实例化一个etree对象
from lxml import etree tree=etree.HTML(page_text)xpath标签定位和文本数据的获取
标签定位
## / 表示一个层级 tree.xpath('/html/dody/div')##返回的是列表,并且是element队形 ## // 表示多个层级 tree.xpath('/html//div')##返回页面所有标签为div的对象 ## 属性定位 tree.xpath('//div[@class='main']')##返回class属性值为main的div ## 索引定位:有多个相同标签定位其中某个标签。注意:索引从1开始 tree.xpath('//*[@id="table_ls"]/table/tbody/tr[1]')
获取文本:text() 返回的是列表
## /text() 只能获取所定位标签下的直系文本数据 tree.xpath('//*[@id="table_ls"]/table/tbody/tr[1]/td[1]/text()') ## //text() 能够获取所定位标签下的所有文本数据 tree.xpath('//*[@id="table_ls"]/table/tbody/tr[1]//text()')
获取标签之间的属性值
tree.xpath('....../@atrrName')#atrrName为属性值的标签对通过selenium爬取的页面源码数据进行解析
tr2=tree.xpath('//*[@id="table_ls"]/table/tbody/tr')##获取tbody下的所有tr标签 for j in range(len(tr2)): data=tr2[j].xpath('.//text()')将解析到的数据写入mysql数据库 数据写入流程
连接mysql
import pymysql conn = pymysql.connect( host= 'localhost', user= 'root', passwd='', database='family', port=3306 , charset='utf8' )
创建数据表
cursor = conn.cursor() ##创建mysql数据表 cursor.execute("drop table if exists 华联控股资金一览流向表") sql = """ create table 华联控股资金一览流向表( 日期 VARCHAr(255), 收盘价 VARCHAr(255), 涨跌幅 VARCHAr(255), 主力净流入净额 VARCHAr(255), 主力净流入净占比 VARCHAr(255), 超大单净流入净额 VARCHAr(255), 超大单净流入净占比 VARCHAr(255), 大单净流入净额 VARCHAr(255), 大单净流入净占比 VARCHAr(255), 中单净流入净额 VARCHAr(255), 中单净流入净占比 VARCHAr(255), 小单净流入净额 VARCHAr(255), 小单净流入净占比 VARCHAr(255) ) """ cursor.execute(sql) sql1 = """insert into 华联控股资金一览流向表 values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
插入数据
cursor.execute(sql1,data)##data为将要向mysql插入的数据
完整代码如下:
from selenium import webdriver from lxml import etree import pymysql conn = pymysql.connect( host= 'localhost', user= 'root', passwd='', database='family', port=3306 , charset='utf8') cursor = conn.cursor() ##创建mysql数据表 cursor.execute("drop table if exists 华联控股资金一览流向表") sql = """ create table 华联控股资金一览流向表( 日期 VARCHAr(255), 收盘价 VARCHAr(255), 涨跌幅 VARCHAr(255), 主力净流入净额 VARCHAr(255), 主力净流入净占比 VARCHAr(255), 超大单净流入净额 VARCHAr(255), 超大单净流入净占比 VARCHAr(255), 大单净流入净额 VARCHAr(255), 大单净流入净占比 VARCHAr(255), 中单净流入净额 VARCHAr(255), 中单净流入净占比 VARCHAr(255), 小单净流入净额 VARCHAr(255), 小单净流入净占比 VARCHAr(255) ) """ cursor.execute(sql) sql1 = """insert into 华联控股资金一览流向表 values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""" bro=webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://data.eastmoney.com/zjlx/000036.html') ##获取响应页面的源码数据 page_text=bro.page_source ###标签定位并解析数据 ##实例化对象 tree=etree.HTML(page_text) ##定位 tr2=tree.xpath('//*[@id="table_ls"]/table/tbody/tr') for j in range(len(tr2)): data=tr2[j].xpath('.//text()') cursor.execute(sql1,tr2[j].xpath('.//text()')) conn.commit()##保存对数据库的修改 cursor.close() # 关闭游标 conn.close() ##关闭mysql连接 bro.quit()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)