php 抓取网页标题(写过如何抓取WEB页面和如何从WEB中提取信息?)

优采云 发布时间: 2021-12-16 04:36

  php 抓取网页标题(写过如何抓取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:dir​​ectedBy"]) 在 Chrome Dev Tools 的 Javascript 控制台中测试 CSS 选择器。

  开始爬行并使用 run 逐步调试您的代码。最好使用多种页面类型进行一次回调测试。然后保存。返回仪表板,找到您的项目并将状态更改为调试或运行,然后按运行按钮

  

  原版:(画风比原版好,有什么问题?)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线