php 抓取网页标题(写过如何抓取WEB页面和如何从WEB中提取信息?)
优采云 发布时间: 2021-12-16 04:36php 抓取网页标题(写过如何抓取WEB页面和如何从WEB中提取信息?)
虽然之前写过如何抓取WEB页面以及如何从WEB页面中提取信息。但是我还是需要一步一步的教程,不然我没有大体的了解。不过,没想到这个教程居然会变成翻译。在这个爬虫教程系列文章中,爬虫(爬取和解析)的一些关键问题将通过实际例子从浅到深讨论。
在教程一中,我们要爬取的网站是豆瓣电影:
您可以在此处获取完整代码并进行测试。
开始前
由于教程是基于pyspider的,所以可以安装一个pyspider(快速入门,也可以直接使用pyspider的demo环境:.
您还应该至少对万维网有一个简单的了解:
所以,爬取一个网页其实就是:
找到收录我们需要的信息的 URL (URL) 列表。通过HTTP协议下载页面。从页面的 HTML 中解析所需的信息。查找此 URL 的更多信息。返回 2 并继续选择起始 URL。
既然我们要抓取所有的电影,首先我们需要抓取一个电影列表,一个好的列表应该:
我们再次扫描,发现没有收录所有电影的列表。我们只能排在第二位,通过抓取类别下的所有标签列表页面来遍历所有电影:
创建项目
在pyspider的dashboard右下角,点击“Create”按钮
替换 on_start 函数的 self.crawl 的 URL:
python@every(minutes=24 * 60)
def on_start(self):
self.crawl('http://movie.douban.com/tag/', callback=self.index_page)
点击绿色运行执行,在follower会看到一个红色的1,切换到follower面板,点击绿色播放按钮:
标签列表页面
在标签列表页面中,我们需要提取所有电影列表页面的 URL。您可能已经发现示例处理程序提取了大量的 URL。因此,提取列表页面 URL 的一种可行方法是使用常规过滤器将其过滤掉:
pythonimport re
...
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
for each in response.doc('a[href^="http"]').items():
if re.match("http://movie.douban.com/tag/\w+", each.attr.href, re.U):
self.crawl(each.attr.href, callback=self.list_page)
由于pyspider是纯Python环境,你可以使用Python强大的内置库或者你熟悉的第三方库来解析页面。但是,更推荐使用 CSS 选择器。
电影列表页面
再次点击运行进入电影列表页面(list_page)。在这个页面中,我们需要提取:
CSS 选择器
顾名思义,CSS 选择器是 CSS 用来定位需要设置样式的元素的表达式。由于前端程序员使用 CSS 选择器来为页面上的不同元素设置样式,因此我们也可以使用它来定位所需的元素。您可以在 CSS 选择器参考手册中了解有关 CSS 选择器语法的更多信息。
在 pyspider 中,response.doc 的 PyQuery 对象是内置的,允许您使用类似 jQuery 的语法来操作 DOM 元素。您可以在 PyQuery 页面上找到完整的文档。
CSS 选择器助手
在pyspider中,还内置了一个CSS Selector Helper,当你点击页面上的一个元素时,它可以帮助你生成它的CSS选择器表达式。您可以单击启用 CSS 选择器助手按钮,然后切换到网页:
开启后,鼠标放在元素上,会以*敏*感*词*高亮显示。单击后,将突出显示具有相同 CSS 选择器表达式的所有元素。该表达式将被插入到 python 代码中的当前光标位置。创建以下代码,将光标放在单引号之间:
pythondef list_page(self, response):
for each in response.doc('').items():
单击指向电影的链接,CSS 选择器表达式将插入到您的代码中。重复此操作以插入链接以翻页:
pythondef list_page(self, response):
for each in response.doc('HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV>TABLE TR.item>TD>DIV.pl2>A').items():
self.crawl(each.attr.href, callback=self.detail_page)
# 翻页
for each in response.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)
电影详情页面
再次单击运行并转到详细信息页面。使用 css 选择器助手分别添加电影标题、评分和导演:
pythondef detail_page(self, response):
return {
"url": response.url,
"title": response.doc('HTML>BODY>DIV#wrapper>DIV#content>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(),
"导演": [x.text() for x in response.doc('a[rel="v:directedBy"]').items()],
}
请注意,您会发现 css 选择器助手并不总是提取适当的 CSS 选择器表达式。您可以借助 Chrome Dev Tools 编写合适的表达式:
右键单击要提取的元素,然后单击review 元素。不需要像自动生成的表达式那样写出所有的祖先节点,只需写出关键节点的属性,可以区分你不需要的元素。但这需要有爬虫和前端网页的经验。所以,学习爬虫最好的方法就是学习这个页面/网站是怎么写的。
您还可以使用 $$(a[rel="v:directedBy"]) 在 Chrome Dev Tools 的 Javascript 控制台中测试 CSS 选择器。
开始爬行并使用 run 逐步调试您的代码。最好使用多种页面类型进行一次回调测试。然后保存。返回仪表板,找到您的项目并将状态更改为调试或运行,然后按运行按钮
原版:(画风比原版好,有什么问题?)