当前位置: 首页 > 科技观察

pyspider爬虫教程(一):HTML和CSS选择

时间:2023-03-13 20:30:32 科技观察

虽然之前写过如何爬取WEB页面,如何从WEB页面提取信息。但是感觉还是需要一步一步的教程,不然没有整体的了解。不过,没想到这篇教程变成了翻译。在本系列爬虫教程中,我们将通过实例,由浅入深地讨论爬虫(爬虫和解析)的一些关键问题。在教程一中,我们要爬取的网站是豆瓣电影:http://movie.douban.com/完整代码可以在:http://demo.pyspider.org/debug/tutorial_douban_movie获取并测试。开始之前由于教程是基于pyspider的,所以你可以安装一个pyspider(快速入门,也可以直接使用pyspider的demo环境:http://demo.pyspider.org/。你也应该至少有一个简单的了解什么是万维网概要:万维网是由许多相互链接的超文本页面(以下简称网页)组成的系统。网页使用网址(URL)来定位和相互链接网页使用HTTP协议传输网页使用HTML来描述外观和语义所以,爬取网页实际上是:找到包含信息的网址(URL)列表我们需要通过HTTP协议把页面下载回来从页面的HTML中解析出需要的信息为此找到更多的URL,回到2继续选择一个起始URL由于我们要爬取所有的电影,首先我们需要抓取一个电影列表,一个好的列表应该:包含足够的电影的URL通过翻页,可以遍历到一个所有电影按照更新时间排序的列表,可以更快的抓取最新更新的电影。我们在http://movie.douban.com/上扫了一下,发现没有一个列表可以包含所有的电影,只能回去遍历所有的电影,抓取类别下的所有标签列表页:http://movie.douban.com/tag/在pyspider中创建一个项目在dashboard右下角点击“Create”按钮,将on_start函数中self.crawl的url替换为:@every(minutes=24*60)defon_start(self):self.crawl('http://movie.douban.com/tag/',callback=self.index_page)self.crawl告诉pyspider抓取指定页面,然后使用回调函数解析结果。@every装饰器,表示每天执行一次on_start,这样就可以抓到最新的电影了。点击绿色run执行,会看到follows上有一个红色的1,切换到follows面板,点击绿色播放按钮:标签列表页面在标签列表页面,我们需要提取电影列表的所有url页。你可能已经发现示例处理程序提取了一个非常大的URL,因此提取列表页URL的一种可行方法是使用正则表达式将其过滤掉:importre...@config(age=10*24*60*60)defindex_page(self,response):foreachinresponse.doc('a[href^="http"]').items():ifre.match("http://movie.douban.com/tag/\w+",each.attr.href,re.U):self.crawl(each.attr.href,callback=self.list_page)由于电影列表页和标签列表页的长度不同,这里新建一个回调self.list_page@config(age=10*24*60*60)这意味着我们认为该页面在10天内有效并且不会再次更新。由于pyspider是纯Python环境,你可以使用Python强大的内置库,或者你熟悉的第三方库来解析页面。但是,首选CSS选择器。电影列表页面再次单击运行会将我们带到电影列表页面(list_page)。在这个页面中我们需要提取:电影链接,比如http://movie.douban.com/subject/1292052/下一页的链接,用来翻页CSS选择器CSS选择器,顾名思义,就是用到的通过CSS用于定位需要设置样式的元素的表达式。由于前端程序员使用CSS选择器来为页面上的不同元素设置样式,我们也可以使用它来定位我们需要的元素。您可以在此处的CSS选择器参考中了解有关CSS选择器语法的更多信息。在pyspider中,response.doc的内置PyQuery对象允许您使用类似jQuery的语法来操作DOM元素。您可以在PyQuery的页面上找到完整的文档。CSSSelectorHelper在pyspider中,还有一个内置的CSSSelectorHelper,当你点击页面上的某个元素时,它可以帮你生成它的CSS选择器表达式。可以点击EnableCSSselectorhelper按钮,然后切换到网页:启用后,鼠标放在元素上,会以黄色高亮显示。单击后,所有具有相同CSS选择器表达式的元素将被高亮显示。表达式将插入到python代码中的当前光标位置。创建以下代码,将光标保持在单引号之间:deflist_page(self,response):foreachinresponse.doc('').items():单击电影链接,CSS选择器表达式将插入到您的代码中,如此重复,插入翻页链接:deflist_page(self,response):foreachinresponse.doc('HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV>TABLETR.item>TD>DIV.pl2>A').items():self.crawl(each.attr.href,callback=self.detail_page)#turnpageforeachinresponse.doc('HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.paginator>A').items():self.crawl(each.attr.href,callback=self.list_page)翻页是一个到自己的callback回调电影详情页,再次点击run会跟随到详情页。使用cssselectorhelper分别添加电影标题、分数和导演:defdetail_page(self,response):return{"url":response.url,"title":response.doc('HTML>BODY>DIV#wrapper>DIV#内容>H1>SPAN').text(),"rating":response.doc('HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.indent.clearfix>DIV.subjectwrap.clearfix>DIV#interest_sectl>DIV.rating_wrap.clearbox>P.rating_self.clearfix>STRONG.ll.rating_num').text(),"Director":[x.text()forxinresponse.doc('a[rel="v:dir??ectedBy"]').items()],}请注意,您会发现css选择器助手并不总是提取正确的CSS选择器表达式。您可以借助ChromeDevTools编写合适的表达式:右键单击要提取的元素,然后单击InspectElement。你不需要像自动生成的表达式一样写所有的祖先节点,只写关键节点的属性,可以区分你不需要的元素。不过这个需要有爬虫和web前端的经验。所以,学习爬虫最好的方法就是学习这个页面/网站是怎么写的。您还可以在Chrome开发工具的Javascript控制台中使用$$(a[rel="v:dir??ectedBy"])测试CSS选择器。开始爬取使用run单步执行你的代码,最好使用多种页面类型进行一次回调测试。然后保存。返回仪表板,找到您的项目,将状态更改为DEBUG或RUNNING并按下运行按钮