selenium判断一篇论文是否被ei收录
问题
要判断一篇论文是否被ei收录,一般流程是去http://www.engineeringvillage.com/search/quick.url
网址,进入搜索框输入论文名,页面会返回一个结果,如下图


现有一个待查论文名称excel,需要查询得到它们是否被ei收录。最近正好在学习selenium,就想来用它解决一下。
环境及工具
python3.6+selenium+Firefox
环境搭建参见https://blog.csdn.net/qq_34908107/article/details/80533338
分析解决
观察url,输入框搜索A Miniaturized Polarization Insensitive Frequency Selective Surface at Ka-band时,url变成https://www.engineeringvillage.com/search/quick.url?SEARCHID=26faf1baecc84588abeab4c298b8e3bc&COUNT=1&usageOrigin=&usageZone=,虽然用的是get方式,但是后面这一串searchid没有找到与论文名的关系,而且两次同样名称不同时间的查询url名称不一样,https://www.engineeringvillage.com/search/quick.url?SEARCHID=431a25da6bfa4505b6bc4123f0979fdb&COUNT=1&usageOrigin=&usageZone=,这个url计算不出来,于是选择使用selenium来操作,总体流程如下,



要想得到记录值,需要得到的是html中id是result-count元素的值
(ps:提交查询的时候,目前还没有发现需要输入验证码)
代码如下:
#coding:utf-8
from selenium import webdriver
import time
brower = webdriver.Firefox()
brower.get("http://www.engineeringvillage.com/search/quick.url")
paper_name='A Semantic-based Inference Control Algorithm for RDF Stores Privacy Protection'
brower.find_element_by_id('search-word-1').send_keys(paper_name)
rs=brower.find_element_by_id('results-count')
print(rs)
# time.sleep(3)
brower.close()
报错 “selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="results-count"]”

搜了下,在想自己是不是定位元素的方式错了,于是换成xpath找
rs=brower.find_element_by_xpath('//*[@id="results-count"]')
结果还是报一样的错,说明当前页面还没有这个元素,结果被我find了,所以找不到,说明问题不在这里。
运行的时候发现,当代码运行到brower.find_element_by_xpath之前没有loading,而这个页面搜索出结果之前都有loading,速度都是一样的慢,于是恍然大悟,发现光填了搜素框没有点击搜索(狗头围笑),于是加上代码如下
from selenium import webdriver
import time
brower = webdriver.Firefox()
brower.get("http://www.engineeringvillage.com/search/quick.url")
paper_name='A Semantic-based Inference Control Algorithm for RDF Stores Privacy Protection'
qry=brower.find_element_by_id('search-word-1')
qry.send_keys(paper_name)
tj=brower.find_element_by_id('searchBtn')
tj.click()
time.sleep(5)
rs=brower.find_element_by_id('results-count')
print(rs.get_attribute('textContent'))
brower.close()
结果如下,


判断返回的结果只要不是“No results were found”,就是被收录有记录。读取excel获得待读取的列表,遍历一遍即得被收录的文章列表。
讨论
初学selenium,感觉是从模拟客户端操作的角度,直接操作用户所得所见的页面来操作的,强大!正常一般都先去分析请求,构建请求(就是构建不出来那个url),抓包分析响应报文,应该查询完会返回一个表示结果的json,但是还不太会,或者其他别的思路还求各位大佬进来讨论讨论。