现在很多的大型网站都利用率异步加载技术以减少服务器的压力,当我们想爬取利用异步加载的网站数据时,一般无法直接通过显式的url来获取网页源码,对此一般的方法是通过逆向分析来寻找隐藏的url,然后通过这个隐藏的url来获取网页源码。但是问题在于,这个过程需要自己去寻找url的规律,寻找并尝试出有效的隐藏的url,这个过程并不一定有效,因为尽管找到了隐藏的url,但是其不一定具有明显的规律,如果在找不到规律的前提下,又要爬取大量的网页数据,这时我们可以用相对低效一点的方法来解决这个问题,即通过selenium来模拟浏览器,通过模拟浏览器的操作来获取需要的网页源码,然后解析得到需要的数据。
看如下示例代码。该示例代码中,先进入到某个页面,然后点击某个页面的元素,示例中先点击的是一个下拉框,然后再点击下拉框中的某个元素,便进入了我们需要的页面,然后通过driver.page_source获取网页源码,再对源码进行解析获取需要的数据。
from lxml import etree
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('your url')
elem=driver.find_element_by_xpath('corresponding element')
elem.click()
time.sleep(5)
elem1=elem.find_element_by_xpath('/html/body/div[7]/div[3]/ul/li[3]')
elem1.click()
time.sleep(7)
html=driver.page_source
selector=etree.HTML(html)
url_infos=selector.xpath('corresponding xpath')
driver.close()
selenium可以模拟浏览器进行任何操作,这样我们就可以任意的点进我们需要的页面,然后通过浏览器驱动的page_source属性获取网页源码,再进行解析即可,这样实际上就可以避免抓包这个过程。当然,这个方法相对来说比较低效,因为要打开浏览器,等待浏览器相应,并点击相应的元素来进入到指定的页面,这个过程是比较消耗时间的,而且有时候如果要实现更灵活的操作,需要对selenium比较熟悉,如果需要进一步熟悉selenium,可以参考笔者关于selenium的博客专题,到笔者博客主页点击selenium分类即可。总而言之,这个方法只是退而求其次的方法,仅供抓包方法失效后参考。
最后需要提醒的一点是,selenium最好仅用来进行网页跳转等操作,尽管也可以通过selenium获取网页元素并提取数据,但是最好不要用此方式,因为如果数据量稍微多一点,就会极大的影响效率,selenium获取元素的效率其实不高。所以如果要获取网页的元素,最好先用driver.page_source获取网页源码后再用lxml或者xml.dom.minidom.parse来解析,然后提取需要的数据。