我觉得在网上看到别人的代码,不要一昧地拿来主义,复制粘贴就行了,你要结合你自己的本地环境对代码做适当地修改。比如定位Xpath元素路径,不通电脑或者说不同浏览器同一元素的Xpath路径有可能不是一样的,这个路径在我本地运行没问题,到了你那里就报错
当看别人的代码时,最好先搞清楚:
我们先来看下如果要通过关键词搜索文献,该怎么操作?
结合前面的需求分析,我们就可以对网页进行分析并定位出对应的元素
往输入框传入数据之后,我们需要点击下面的【检索】按钮
selenium是一个自动化测试工具,可以用来进行web自动化测试。其本质是通过驱动浏览器,完全模拟浏览器的操作(比如跳转、输入、点击、下拉等)来实现网页渲染之后的结果,可支持多种浏览器
爬虫中用到selenium主要是为了解决requests无法直接执行JavaScript代码等问题
importtimefromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.desired_capabilitiesimportDesiredCapabilitiesfromselenium.webdriver.common.action_chainsimportActionChains创建浏览器对象
这里我用的是Edge浏览器
defwebserver():#get直接返回,不再等待界面加载完成desired_capabilities=DesiredCapabilities.EDGEdesired_capabilities["pageLoadStrategy"]="none"#设置微软驱动器的环境options=webdriver.EdgeOptions()#设置浏览器不加载图片,提高加载速度options.add_experimental_option("prefs",{"profile.managed_default_content_settings.images":2})#创建一个微软驱动器driver=webdriver.Edge(options=options)returndriver爬取网页
其实逻辑并不难,就是先定位到各个元素然后用selenium来模拟我们人为点击浏览器的操作就行了
首先打开页面,等待个一两秒让网页完全加载
这里我们通过执行js脚本来修改里面的style属性
#修改属性,使下拉框显示opt=driver.find_element(By.CSS_SELECTOR,'div.sort-list')#定位下拉框#执行js脚本进行属性的修改;arguments[0]代表第一个属性driver.execute_script("arguments[0].setAttribute('style','display:block;')",opt)下拉框显示出来之后我们需要点击【关键词】,这样才会切换到关键词搜索
这里需要注意的是,当我在测试的时候发现下拉框加载是有问题的,这时候代码会报错说Element
用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等
selenium给我们提供了一个类来处理这类事件——ActionChains
还有一点需要注意的是:如果鼠标只是移到【关键词】,下拉框其实还是不能正确加载出来,最好是移动到下拉框的最底部或者关键词后面的元素,这里我移动到【通讯作者】
下拉框加载完成之后,定位到【关键词】再点击
#鼠标移动到下拉框ActionChains(driver).move_to_element(driver.find_element(By.CSS_SELECTOR,'li[data-val="RP"]')).perform()#找到[关键词]选项并点击WebDriverWait(driver,100).until(EC.visibility_of_element_located((By.CSS_SELECTOR,'li[data-val="KY"]'))).click()定位出搜索框,传入我们要搜索的关键词
#传入关键字WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'''//*[@id="gradetxt"]/dd[1]/div[2]/input'''))).send_keys(keyword)#点击搜索WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,"/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input"))).click()搜索结果出来之后定位【文献条数】,获取对应的条数(text标签)
#获取总文献数和页数res_unm=WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,"/html/body/div[3]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em"))).text