三、网站元素定位
对于元素定位这块会比较麻烦,我单独讲一讲
确定元素
首先要确定要找元素的特征
我这里就要扒一扒对应地址的解决问题数。我们可以按ctrl+shift+c 然后点对应的元素就会像图上这样出现我要的元素位置。
然后我们很容易发现他是在解决问题的同级别的<b>标签下。
我们可以用相对位置来定位
//*[text()="解决问题"]
这个表示的是找到解决问题对应的标签
我们需要的数据其实是其同层级下的b标签的数据
那么就是
//*[text()="解决问题"]/../b
其中…表示上级目录 我们就可以定位到所要的数据了
submitTag = driver.find_elements_by_xpath('//*[text()="解决问题"]/../b') distance = submitTag[0].text
最后就是拿到我们想要的数据 我们需要的数据格式是text
网络延迟
如果我们因为网络延迟或者访问量过大没有抓到数据怎么办呢?
我的想法就是休息3s再抓,如果重试5次还是抓不到那就下一个跳过
那我们怎么直到抓没抓到呢?
submitTag = driver.find_elements_by_xpath('//*[text()="解决问题"]/../b')
这句里面用的elements返回的是个列表,所以长度为0就是没找到
然后是等待重试语句
if(len(submitTag) == 0): for k in range(1,5): sleep(3) driver.get(lie) submitTag = driver.find_elements_by_xpath('//*[text()="解决问题"]/../b') if(len(submitTag) != 0): break if(len(submitTag) == 0): print("false") i+=1 continue
看着很长。其实一点也不复杂,第一个for会进行五次重试,每次重试完如果拿到数据就跳出
如果5次循环结束还是拿不到,就让i+1其实就是跳过了这组数据啦。
五、最终成果
import pandas as pd import openpyxl from selenium import webdriver from time import sleep num = 10 #写入的数据列 driver = webdriver.Chrome() df = pd.read_excel('111.xlsx',index_col='LeetCode地址') #读取一整列的数据 wb=openpyxl.load_workbook(r'111.xlsx') ws = wb['Sheet1'] i = 1 for lie in df.index.values: driver.get(lie) submitTag = driver.find_elements_by_xpath('//*[text()="解决问题"]/../b') if(len(submitTag) == 0): for k in range(1,5): sleep(3) driver.get(lie) submitTag = driver.find_elements_by_xpath('//*[text()="解决问题"]/../b') if(len(submitTag) != 0): break if(len(submitTag) == 0): print("false") i+=1 continue distance = submitTag[0].text ws.cell(row = i+1, column = num).value = distance i=i+1 print(i) wb.save(r'111.xlsx')
利用num保存写入列是为了以后能够方便修改 打印i是为了能看到进度
六、写在最后
当然这个只是第一次入门的小作品,其中没用封装成函数,也没有用到类对象什么的高级运用,但是可以作为一个语言的基础中的基础中的入门,如果大家喜欢这个系列还麻烦大家给个赞啥的。