丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
最近有小伙伴后台跟我说,临近毕业,写毕业论文需要上知网查找大量的文献
我一听好家伙,这位小伙伴是懂偷懒的,想起当初我写毕业论文的时候也是饱经查阅文献的折磨,深知那种滋味
但是知网作为国内知名的文献数据库之一,有着极其复杂的反爬虫机制,例如动态JS、iframe、验证码等等,不是说想爬就能爬的
像我之前采用requests模拟请求的方法来爬取的话难度很大,一个不小心就有可能被封IP
selenium是一个自动化测试工具,可以用来进行web自动化测试
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
爬虫中用到selenium主要是为了解决requests无法直接执行JavaScript代码等问题
下面就来介绍下selenium基础用法
Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等
我们只要首先下载好相应浏览器的驱动(webdriver)到Python主目录中,或者加入环境变量即可
fromseleniumimportwebdriverbrowser=webdriver.Chrome()browser=webdriver.Firefox()browser=webdriver.Edge()browser=webdriver.Safari()访问页面
我们可以用get()方法来请求一个网页,传入参数链接URL
#根据id查找find_element_by_id()#根据name查找find_element_by_name()#根据classname查找find_element_by_class_name()#根据Tagname查找find_element_by_tag_name()#根据完整超链接查找find_element_by_link_text()#根据部分超链接查找find_element_by_partial_link_text()#根据xpath查找find_element_by_xpath()#根据css选择器查找find_element_by_css_selector()PS:
上面的element变成elements(例如find_elements_by_id)就是找到所有满足的条件,然后返回数据
等待页面加载完成
有显式等待和隐式等待
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)
常用浏览器操作
在找到浏览器相应元素的位置之后,我们就需要进行一些交互动作,例如双击、点击、输入、获取网页源码等等
通过对当前页面分析,发现每条文献条目的xpath是有规律的
导入所需包
importtimefromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.desired_capabilitiesimportDesiredCapabilities创建浏览器对象
这里我用的是Edge浏览器
#get直接返回,不再等待界面加载完成desired_capabilities=DesiredCapabilities.EDGEdesired_capabilities["pageLoadStrategy"]="none"#设置Edge驱动器的环境options=webdriver.EdgeOptions()#设置Edge不加载图片,提高速度options.add_experimental_option("prefs",{"profile.managed_default_content_settings.images":2})#创建一个Edge驱动器driver=webdriver.Edge(options=options)传入url参数然后模拟对浏览器进行人为操作
适当的加入time.sleep()方法,等待页面加载完成
不然页面还没完全加载就执行下一步操作的话会报错
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#去除千分位的逗号res_unm=int(res_unm.replace(",",''))page_unm=int(res_unm/20)+1print(f"共找到{res_unm}条结果,{page_unm}页。")对结果页进行解析
完整代码如下:
网络并不是可靠的,我在调试程序的时候往往出现网页加载过慢导致元素查找出错
desired_capabilities=DesiredCapabilities.EDGEdesired_capabilities["pageLoadStrategy"]="none"在需要等待网页加载完全之后才能执行下一步骤的地方加上time.sleep()方法休眠几秒,既可以等待页面加载,也可以防止爬取太快被封IP
代码逻辑出错导致爬取不了20倍页数的第20条文献信息
刚开始写的时候,逻辑不够准确,导致第20页、40页、60页(20整数倍)的第20条文献爬取不了