当前位置: 首页 > 后端技术 > Python

【爬虫】Python+selenium+firefox使用部署详解

时间:2023-03-26 16:12:24 Python

我的梦想值得为自己奋斗。我今天的生活绝对不是我昨天生活的冷酷抄袭。——司汤达《红与黑》1.概述我不是专业的爬虫工程师,但我对爬虫很感兴趣。学习了requests、scrapy等python库来爬取一些网站数据。最近因为需要,开始做一些爬虫相关的东西。写这篇文章的目的是记录自己的学习过程和遇到的问题,一方面巩固所学的知识,另一方面希望给遇到同样问题的朋友提供一些帮助。本文主要介绍以下几个方面(这也是我自己学习的过程):为什么使用selenium传统方式配置使用selenium2.为什么使用selenium在使用requests等爬虫工具时,使用requests.get(url)命令获取网页内容,我们发现没有我们需要的内容,那是因为有些网页是前后端分离的,需要浏览器执行js脚本通过ajax请求获取数据,然后将它们渲染到页面上。如果直接请求这个页面的地址,得到的html是没有数据的。有些网站的网页是js生成的,不是原生的HTML代码,不包含Ajax请求。如何解决这个问题呢?通常可以通过分析js脚本,找到调用接口,直接请求接口获取数据,但是这些接口都有加密或者鉴权,请求接口比较麻烦。对于需要执行js脚本生成页面的网站,直接通过接口获取数据是不可能的。为了方便,我们可以直接使用selenium+(浏览器驱动)firefox来模拟浏览器的行为。通过这个工具,我们可以执行js脚本来获取整个网页的完整数据。Selenium是一种自动化测试工具。具体使用方法可以查看官方文档:https://www.selenium.dev/docu...比如头条新闻网页的数据是经过算法加密的,无法直接请求界面。需要破解加密规则,网上很多大佬都写过,如果抓取今日头条的数据,可以自己百度一下。总之,坑很多,很麻烦。后面会介绍如何使用selenium抓取今日头条的数据。我大概知道使用selenium可以获取任何网页中的数据,但是使用selenium的缺点如下:效率低。每个请求相当于打开一个浏览器。这种启动效率相比直接调用接口是非常低的。通常需要几秒钟。资源浪费selenium模拟了浏览器的行为,大量的请求会极度消耗资源。3.传统的配置方式使用selenium1。windows下配置selenium这里主要演示python+selenium爬取数据的使用,所以下面只介绍python的安装方法。其他安装方式请参考官方文档。安装Selenum库使用以下命令安装selenium库:pipinstallseleniuminstallfirefoxbrowserfirefox下载地址:http://www.firefox.com.cn/dow...根据需要下载对应环境的安装包,因为这里是在windows下配置的,所以下载windows。下载完成后,双击.exe文件,点击下一步完成安装。安装firefox浏览器驱动安装浏览器后,还需要安装浏览器驱动,才能使浏览器完成相应的操作。因为这里使用的是firefox浏览器,所以需要安装其对应的驱动geckodriver。如果没有安装geckodriver,运行时使用如下代码:importtimefromselenium.webdriverimportFirefoxfromseleniumimportwebdriverdriver=webdriver.Firefox()driver.get("https://www.toutiao.com/a6969138023774667264/")时间。sleep(2)html=driver.page_sourceprint(html)driver.quit()会报如下错误:FileNotFoundError:[WinError2]系统找不到指定的文件。回溯(最近调用last):raiseWebDriverException(selenium.common.exceptions.WebDriverException:Message:'geckodriver'executableneedstobeinPATH.官方关于geckodriver的介绍如下:geckodriver:useW3CWebDrivercompatibleclientandGecko-basedbrowsing服务器交互的代理。该程序提供WebDriver协议描述的HTTPAPI来与Gecko浏览器(如Firefox)进行通信。它通过充当本地端和远程端之间的代理将调用转换为Marionette远程协议。Geckodriver下载地址:https://github.com/mozilla/ge...1.请根据系统版本选择下载,如下图:2.下载解压后,将getckodriver.exe添加到Path环境变量,如果不想加入环境变量,也可以在创建firefox驱动实例时指定geckodriver的位置:webdriver.Firefox(executable_path="E:/Downloads/geckodriver/geckodriver.exe")3.将getckodriver添加到环境变量中,需要重启cmd或idea其他浏览器浏览器驱动下载地址支持的操作系统维护者下载问题trackingChromium/ChromeWindows/macOS/LinuxGoogle下载问题FirefoxWindows/macOS/LinuxMozilla下载问题EdgeWindows10Microsoft下载问题InternetExplorerWindowsSelenium项目组下载问题SafarimacOSElCapitan等高版本苹果内置问题OperaWindows/macOS/LinuxOpera下载问题二、linux中配置seleniumselenium在linux中的配置步骤同配置步骤关于windows,这里简单介绍一下。安装selenum库使用以下命令安装selenium库:pipinstallseleniuminstallfirefoxbrowserfirefox下载地址:http://www.firefox.com.cn/dow...使用以下命令下载linux版本的firefox浏览器:wgethttps://download-ssl.firefox.com.cn/releases/firefox/esr/91.0/zh-CN/Firefox-latest-x86_64.tar.bz2下载完成后,使用以下命令解压得到Firefox-latest-x86_64。tar:bunzip2-dFirefox-latest-x86_64.tar.bz2使用如下命令再次解压:tar-xvfFirefox-latest-x86_64.tar安装firefox浏览器驱动geckodriver驱动下载地址:https://github.com/mozilla/ge...使用以下命令下载linux系统驱动:wgethttps://github.com/mozilla/geckodriver/releases/download/v0.29.1/geckodriver-v0.29.1-linux64.tar.gz解压后geckodriver可以存放在/usr/local/bin/路径下tar-zxvfgeckodriver-v0.29.1-linux64.tar.gzcpgeckodriver/usr/local/bin/IE和Chrome浏览器同理,IEDriverServer,chromedriver安装方法4.python+selenium获取今日头条数据。下面的代码是根据url获取今日头条的标题、发布时间、来源、文字内容、图片地址。详情见代码注释:fromlxmlimportetreefromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasEC#和下面的WebDriverWait一起使用fromselenium.webdriver.support.waitimportWebDriverWaitdefhtml_selenium_firefox(url):"""使用selenium根据url获取网页源码:paramurl:url:return:网页源代码"""opt=webdriver.FirefoxOptions()#设置无接口opt.add_argument("--headless")#禁用gpuopt.add_argument('--disable-gpu')#指定firefox的安装路径,如果配置了环境变量,则不需要指定firefox_binary="C:\\ProgramFiles(x86)\\MozillaFirefox\\firefox.exe"#指定geckodirver的安装路径,如果配置了环境变量,不需要指定executable_path="E:\\Downloads/geckodriver\\geckodriver.exe"driver=webdriver.Firefox(firefox_binary=firefox_binary,executable_path=executable_path,options=opt)#发送请求driver.get(url)#显式等待:显式等待元素加载wait=WebDriverWait(driver,20)wait.until(EC.presence_of_element_located((By.CLASS_NAME,'article-content')))wait.until(EC.presence_of_element_located((By.TAG_NAME,'span')))#获取网页源codehtml=driver.page_source#关闭浏览器版本资源driver.quit()返回htmldefget_news_content(url):html=html_selenium_firefox(url)tree=etree.HTML(html)title=tree.xpath('//div[@class="article-content"]/h1/text()')[0]#xpath查找没有类的元素:span[not(@class)]pubtime=tree.xpath('//div[@class="article-metamt-4"]/span[not(@class)]/text()')[0]#xpath查找class="name"的元素:span[@class="name"]source=tree.xpath('//div[@class="article-metamt-4"]/span[@class="name"]/a/text()')[0]#xpath一个标签中的所有元素://divcontent=tree.xpath('//article')[0]#处理内容乱码content=str(etree.tostring(content,encoding='utf-8',method='html'),'utf-8')#提取内容地址中的所有图片images=etree.HTML(content).xpath('//img/@src')result={"title":标题,"pubtime":发布时间,"source":来源,"content":内容,"images":图片,}返回结果if__name__=='__main__':url="https://www.toutiao.com/a6969138023774667264/"result=get_news_content(url)print(result)selenium和xpath的更多用法可以查看官方文档,这里不再详细参考文章:https://blog.csdn.net/rhx_qiu...https://github.com/mozilla/ge...https://www.selenium.dev/docu...