当前位置:合肥网站优化 > seo教程 >

如何抓取别人网页的数据(3种网页抓取方法)

来源:懒猫seo博客  作者:懒猫  发布时间:2020-08-13 14:57:52  阅读:  分类:seo教程

导读:3种抓取其中数据的方法。首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块。 1 正则表达式 如果你对正则表达式还不熟悉,或是需要一些提示,那么你可以查阅...

3种抓取其中数据的方法。首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块。

1 正则表达式

如果你对正则表达式还不熟悉,或是需要一些提示,那么你可以查阅https://docs.python.org/2/howto/regex.html获得完整介绍。即使你使用过其他编程语言的正则表达式,我依然推荐你一步一步温习一下Python中正则表达式的写法。

由于每章中都可能构建或使用前面章节的内容,因此我建议你按照类似本书代码库的文件结构进行配置。所有代码都可以从代码库的code目录中运行,以便导入工作正常。如果你希望创建一个不同的结构,请注意需要变更所有来自其他章的导入操作(比如下述代码中的from chp1.advanced_link_crawler)。

当我们使用正则表达式抓取国家(或地区)面积数据时,首先需要尝试匹配``元素中的内容,如下所示。

>>> import re>>> from chp1.advanced_link_crawler import download>>> url = 'http://example.python-scraping.com/view/UnitedKingdom-239'>>> html = download(url)>>> re.findall(r'(.*?)', html)['<img />', '244,820 square kilometres', '62,348,447', 'GB', 'United Kingdom', 'London', '<a>EU</a>', '.uk', 'GBP', 'Pound', '44', '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA', '^(([A-Z]d{2}[A-Z]{2})|([A-Z]d{3}[A-Z]{2})|([A-Z]{2}d{2} [A-Z]{2})|([A-Z]{2}d{3}[A-Z]{2})|([A-Z]d[A-Z]d[A-Z]{2}) |([A-Z]{2}d[A-Z]d[A-Z]{2})|(GIR0AA))$', 'en-GB,cy-GB,gd', '<div><a>IE </a></div>']

从上述结果中可以看出,多个国家(或地区)属性都使用了``标签。如果我们只想抓取国家(或地区)面积,可以只选择第二个匹配的元素,如下所示。

>>> re.findall('(.*?)', html)[1]'244,820 square kilometres'

虽然现在可以使用这个方案,但是如果网页发生变化,该方案很可能就会失效。比如表格发生了变化,去除了第二个匹配元素中的面积数据。如果我们只在当下抓取数据,就可以忽略这种未来可能发生的变化。但是,如果我们希望在未来某一时刻能够再次抓取该数据,就需要给出更加健壮的解决方案,从而尽可能避免这种布局变化所带来的影响。想要该正则表达式更加明确,我们可以将其父元素``也加入进来,由于该元素具有ID属性,所以应该是唯一的。

>>> re.findall('<label for="places_area">Area: </label>(.*?)', html)['244,820 square kilometres']

这个迭代版本看起来更好一些,但是网页更新还有很多其他方式,同样可以让该正则表达式无法满足。比如,将双引号变为单引号,`标签之间添加多余的空格,或是变更area_label`等。下面是尝试支持这些可能性的改进版本。

原创声明:本站所有文章皆由懒猫原创,转载请注明出处与原文地址:http://www.lanmaoseo.com/seojc/4610.html
版权:【本站部分转载文章能找到原作者的我们都会注明,若文章涉及版权请发至邮箱:1695770950@qq.com,我们以便及时处理,可支付稿费。向本站投稿或需要本站向贵司网站定期免费投稿请加QQ:1695770950】
更多信息请关注微信:18621662294
技术支持每天都在等您哦!