关于我的第一个爬虫--Python+selenium+parsel+动态网页

来源:互联网 发布:access数据库设计视图 编辑:程序博客网 时间:2024/06/03 16:10

这是一个用于爬花瓣网的小姐姐照片的爬虫。

虽然以前跟着教程做过一个爬糗事百科的爬虫,但是那个太过基础,印象中只需要修改糗事百科后的页面id号就可以,然后配上正则表达式,获取可用的信息(作者、点赞数、日期等)。回想起来确实是一个十分入门的爬虫。


selenium

首先,参考一个知乎教程(网址不可考),运用了selenium包。其实质上是一个模拟浏览器测试的工具。下载了浏览器(常用如Firefox,Chrome)的Driver以后,可以模拟指定的浏览器。

from selenium import webdriverprofileDir = 'xxxxx'profile = webdriver.FirefoxProfile(profileDir)browser = webdriver.Firefox(profile)browser.get(url)html=browser.page_source

其中profile是所模拟的浏览器的配置,如果不设置的话就会以一个全新的浏览器访问(不包含cookie、插件等)。

selenium中有一个重要的概念叫做Wait,但是在本次实验中,并没有体现出来Wait的优越性,只能下次再深入研究了。:P
Wait有一种应用就是在加载页面的时候,并不需要等到所有的元素都加载完毕再显示页面。而是使用selenium.webdriver.support.expected_conditions在出现期待的情形是便停止加载。


parsel

parsel是Scrapy包中的解析模块。它集成了CSS和XPATH的选择方法,可以方便地在网页内容中选择到需要的部分。
本次主要是学习了XPath的用法,XPath是针对XML而言的,对于如下这个XML的例子

<?xml version="1.0" encoding="utf-8"?><Wikimedia>  <projects>    <project name="Wikipedia" launch="2001-01-05">      <editions>        <edition>en.wikipedia.org</edition>        <edition>fr.wikipedia.org</edition>      </editions>    </project>    <project name="Wiktionary" launch="2002-12-12">      <editions>        <edition>en.wiktionary.org</edition>        <edition>fr.wiktionary.org</edition>    </project>  </projects></Wikimedia>

其中常用有如下三类结点(node):

根(文档)结点 属性结点 元素结点 wikipedia> launch=”2001-01-05” edition>en.wikipedia.org< /edition>

我们就可以通过XPath来取得相应的结点。此外,在用parsel的时候,我们要注意两点:
首先,是关于parsel选择到的对象res也是一个Selector的对象,还需要使用exact_first()方法才能得到所需的结点值。

sel = parsel.Selector(text=text)res = sel.xpath(your_xpath)

除了常规的Xml中的XPath之外,parsel的Selector还支持特殊的contains操作。比如sel.xpath('//script[contains("XXXXX")]'),在本例中,就是用这种方法找到动态网页中的JavaScript部分,然后利用js2xml
包中的parse函数变为XML,在取得目标的。