在使用JavaScript时,很多内容并不会出现在HTML源代码中,所以爬取静态网页的技术可能无法正常使用。因此,我们需要用到动态网页抓取的两种技术:通过浏览器审查元素解析真实网页地址和使用selenium模拟浏览器的方法。
异步更新技术AJAX(Asynchronous Javascript And XML,异步JavaScript和XML),通过在后台与服务器进行少量数据交换就可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下对网页的某部分进行更新。例如百度搜索界面的皮肤: 爬取里面使用AJAX动态加载的内容的两种方法: (1)通过浏览器审查元素解析地址。 (2)通过Selenium模拟浏览器抓取。json数据直接打印显得又多又乱,可以使用json库提取想要的信息例如有些URL地址中有两个特别重要的变量offset和limit,offset显示本页第一项是总的第几项,limit表示每页项目数。基于此,书中给了一个很好的例子(这个例子中,不同页数的评论真实地址之间只体现在offset,所以才有page_str这个变量):
使用本方法无需2-1的操作,直接用网页网址即可
因此,这里介绍另一种方法,即使用浏览器渲染引擎。直接用浏览器在显示网页时解析HTML、应用CSS样式并执行JavaScript的语句。 这个方法在爬虫过程中会打开一个浏览器加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来。用一句简单而通俗的话说,就是使用浏览器渲染方法将爬取动态网页变成爬取静态网页。 我们可以用Python的Selenium库模拟浏览器完成抓取。Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,浏览器自动按照脚本代码做出单击、输入、打开、验证等操作,就像真正的用户在操作一样。
安装 pip install selenium下载geckodriver,在环境变量的PATH中加入这个geckodriver的地址要使用浏览器,可能会需要相应的driver,例如Chromedriver。关于Chromedriver的下载,可以参考这个博客: ChromeDriver与Chrome版本对应参照表及ChromeDriver下载链接上述内容的简单例子: from selenium import webdriver from selenium.webdriver.chrome.webdriver import WebDriver # 产生DesiredCapabilities()对象,并修改对应字典的默认值,不过对于使用chrom暂时没什么用 caps = webdriver.DesiredCapabilities().CHROME # 要调用的浏览器driver地址,根据浏览器不同实现方式会有所差别 # chrom.webdriver里对应的参数需要的是一个字符串,如果不给数据它会去找$PATH executable_path = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe' # 产生对象 driver = WebDriver(executable_path=executable_path) driver.get('https://greasyfork.org/zh-CN/scripts') 书中给的例子仍旧是评论,在driver调用get()以后,driver.find_element_by_css_selector表示用CSS选择器查找元素,找到class为bdy-inner的div元素;find_element_by_tag_name表示通过元素的tag寻找,意思是找到comment中的p元素。 具体增加代码 检查可以看到的内容 运行上述代码,得到的结果是:“第35条测试评论”书中还提及单击特定位置的方法: 使用driver.find_element_by_css_selector()(还有许多其他查找方法,这里只提这一种)找到该元素,然后使用.click()方法模拟单击 load_more = driver.find_element_by_css_selector('div.tie-load-more') load_more.click() Selenium中通过find_element_by_xpath()和find_element_by_css_selector()查找比其他查找函数好一些。Selenium常见的操作元素方法·Clear清除元素的内容。·send_keys模拟按键输入。·Click单击元素。·Submit提交表单。用Selenium控制浏览器加载的内容(火狐使用FirefoxProfile().set_preference()函数调整),可以加快Selenium的爬取速度,常用的方法有: (1)控制CSS(用来控制页面的外观和元素放置位置的)的加载。 (2)控制图片文件的显示。 (3)控制JavaScript的运行。Selenium的官方网站