这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
实验 3
3.1 题目
熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容;
使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。
候选网站:东方财富网:quote.eastmoney.com/center/grid…
3.2 思路
3.2.1 发送请求
- 引入驱动
chrome_path = r"D:\Download\Dirver\chromedriver_win32\chromedriver_win32\chromedriver.exe" # 驱动的路径
browser = webdriver.Chrome(executable_path=chrome_path)
复制代码
- 保存需要爬取的版块
target = ["hs_a_board", "sh_a_board", "sz_a_board"]
target_name = {"hs_a_board": "沪深A股", "sh_a_board": "上证A股", "sz_a_board": "深证A股"}
复制代码
计划是爬取三个模板
的两页
信息。
- 发送请求
for k in target:
browser.get('http://quote.eastmoney.com/center/gridlist.html#%s'.format(k))
for i in range(1, 3):
print("-------------第{}页---------".format(i))
if i <= 1:
get_data(browser, target_name[k])
browser.find_element_by_xpath('//*[@id="main-table_paginate"]/a[2]').click() # 翻页
time.sleep(2)
else:
get_data(browser, target_name[k])
复制代码
注意: 这里的翻页一点要time.sleep(2)
不然他会请求会很快,以至于你虽然翻到第二页了,但是还是爬取第一页的信息!!
3.2.2 获取节点
- 解析网页的时候也要
implicitly_wait
等待一下
browser.implicitly_wait(10)
items = browser.find_elements_by_xpath('//*[@id="table_wrapper-table"]/tbody/tr')
复制代码
然后这个items
就是所以的信息了
for item in items:
try:
info = item.text
infos = info.split(" ")
db.insertData([infos[0], part, infos[1], infos[2],
infos[4], infos[5],
infos[6], infos[7],
infos[8], infos[9],
infos[10], infos[11],
infos[12], infos[13],
])
except Exception as e:
print(e)
复制代码
3.2.3 保存数据
- 数据库类,封装了初始化和插入操作
class database():
def __init__(self):
self.HOSTNAME = '127.0.0.1'
self.PORT = '3306'
self.DATABASE = 'scrapy_homeword'
self.USERNAME = 'root'
self.PASSWORD = 'root'
# 打开数据库连接
self.conn = pymysql.connect(host=self.HOSTNAME, user=self.USERNAME, password=self.PASSWORD,
database=self.DATABASE, charset='utf8')
# 使用 cursor() 方法创建一个游标对象 cursor
self.cursor = self.conn.cursor()
def insertData(self, lt):
sql = "INSERT INTO spider_gp(序号,板块,股票代码 , 股票名称 , 最新报价 ,涨跌幅 ,涨跌额,成交量,成交额 , 振幅, 最高 , 最低 , 今开 , 昨收 ) " \
"VALUES (%s,%s, %s, %s, %s, %s,%s, %s, %s, %s, %s,%s,%s,%s)"
try:
self.conn.commit()
self.cursor.execute(sql, lt)
print("插入成功")
except Exception as err:
print("插入失败", err)
复制代码