Python:【2】使⽤Selenium爬取多页表格数据之前没有接触过爬⾍或者是HTML,但是周围有好多⼈是因为爬⾍才学习的Python。整体思路参照了⼤神的博客:。因为不确定数据是否授权,对⽹站信息进⾏了隐藏,只讨论⽅法的可⾏性,供⼤家参考。如果有错误希望⼤家能够指出~
⽬录
环境和模块准备
需要安装:Python3,Selenium,Chrome浏览器,chromedrive
chromedrive安装步骤见:,需注意版本要和本⾝安装的Chrome浏览器版本⼀致,查看⽅法见:。
元素定位
⾸先需要观察⽹站的源代码,查对应的元素的源码位置。
关于Selenium对⽹站元素的定位⽅法和其他基本操作,见:。但是实际操作之后,⼀直没办法成功定位,咨询了宁宁同学,发现是忽略了iframe这个东西,据说是相当于⽹站中的内嵌⽹站,见:,不过算是⽐较幸运,我在这个⽹站的iframe标签⾥看到了⼀个⽹址,进去之后就可以定位到元素了。
进⼊这个⽹址之后,发现是单独表格存在的⼀个⽹页,在这⾥对元素进⾏定位就可以成功了。
这部分使⽤的定位⽅法是利⽤类名进⾏定位,或者也可以使⽤xpath,对元素定位以及访问数据使⽤的
代码如下:
biao = browser.find_element_by_class_name("list")
td_content = biao.find_elements_by_tag_name("td")
经过尝试,可以成功提取其中的⽂字数据保存到列表中。
翻页设置
对于翻页的设置,我选择了⼀个⽐较简单的⽅法,定位下⼀页按钮的位置,每次采集之后就点击⼀次,并⽤循环来限制点击的次数。利⽤的代码如下:
key = WebDriverWait(browser, 10).until(
EC.visibility_of_element_located((By.XPATH,'/html/body/div/div[4]/nav/ul/li[8]/a'))
)
key.click()
其他⼈的代码⾥加⼊了⼀些感觉是增加鲁棒性的代码,由于时间紧,之后会来补充⼀下这部分。总之⽬前能⽤来爬取数据就可以了。
写⼊⽂件
获得数据后,是⼀维的list数据,我的做法是先利⽤numpy转换list的维度,之后转换为字符串格式,最后去除其中的‘以及其他多余字符,变为⽤空格分割的数据,储存到txt⽂档中,⽅便excel导⼊。利⽤的代码如下:
for td in td_content:
lst.)
if(page >= 197):
lst = np.array(lst).reshape(8,5)
else:
lst = np.array(lst).reshape(15,5)
string = str(lst)
string = place('\'\'', '-')
string = place(',', '')
string = place('\'', '')
string = place('[[', ' ')
string = place(']]', ' ')
string = place('[', '')
string = place(']', '')
stringdata = string + '\n'
data_write_txt('', stringdata)
print('该页已存储')
为了防⽌字符串占⽤内存过⼤,每次爬完⼀页就写⼊⽂件,⽽不是所有的都放进字符串再进⾏写⼊。
整体代码
import numpy as np
from selenium import webdriver
from selenium.webdrivermon.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
<('URL')
wait = WebDriverWait(browser, 10)NONE
def get_data(page):
lst = [] #新建空列表
stringdata = '' #新建空字符串
print('正在爬取第:%s/197 页' % page) #显⽰当前页码
if (page < 197):
key = WebDriverWait(browser, 10).until(
EC.visibility_of_element_located((By.XPATH, '/html/body/div/div[4]/nav/ul/li[8]/a')) )
#到达197页就不⽤进⾏点击了
#定位表格和数据
biao = browser.find_element_by_class_name("list")
td_content = biao.find_elements_by_tag_name("td")
#爬取数据,添加到列表中
for td in td_content:
lst.)
if(page >= 197):
lst = np.array(lst).reshape(8,5) #第197页只有8⾏数据
else:
lst = np.array(lst).reshape(15,5) #前196页有15⾏数据
string = str(lst) #list转换为字符串格式
#去除标点和多余字符
string = place('\'\'', '-')
string = place(',', '')
string = place('\'', '')
string = place('[[', ' ')
string = place(']]', ' ')
string = place('[', '')
selenium怎么使用string = place(']', '')
stringdata = string + '\n'
#写⼊txt⽂件中,注意是append模式
data_write_txt('', stringdata)
print('该页已存储')
if (page < 197):
key.click() #点击下⼀页
def data_write_txt(file_name, datas):
file = open(file_name,'a');
file.write(datas)
file.close();
def main():
for page in range(1,198):
get_data(page)
print("保存⽂件成功,处理结束")
if __name__ == '__main__':
main()
结果如下:
也是有⼀定问题的,对于有些第⼆列数据过长,在⽹页中进⾏了分⾏,结果爬出来也是单占了⼀⾏。我是导⼊excel之后才发现的,因为只有6个这样的数据,就⼿动解决了,不知道有没有其他好办法。这⾥留个坑,以后想办法解决。
将txt数据导⼊excel见:。
参考博客
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论