• 导入需要的模块
  • 需要安装BeautifulSoup

from urllib.request import urlopen, HTTPError, URLError
from bs4 import BeautifulSoup
import re
  • 要抓取的内容里面的链接如图

  • 打开网页审查查看标签如图:

  • 可以看出内容属于标签dd 以及 dd的属性是 class="desc"则:

  • 如果有异常则打印HTTPError, URLError异常内容

    • 首先查找标签bsObj.find('dd', {'class':'desc'})
    • 再查找dd标签下的子标签a,标签a的属性href用正则表达式匹配筛选,因为其下面的链接是以view或者subview开头的
    • 判断如果href属性在标签a中则打印链接.最后完成打印.

try:
html = urlopen('http://baike.baidu.com/link?url=FfHqPzChV9Iz7Kz0d2Mke-1njFShGt8fsFJ5mmyh-t48rnjLMbQNyeBFfmUz3oOCVvRSt0GHJ-nXDqbq9bgrZldbYDPUiQBNckuTBiGt-2Uss1aIWbhj7ELhOfrF3XoFeK2I0mSJ1ERslKeS0wUXtK')
except (HTTPError, URLError) as e:
print(e)
bsObj = BeautifulSoup(html, 'lxml')
for link in bsObj.find('dd', {'class':'desc'}).find_all('a', href=re.compile('^((/view/)*(/subview/)*)((?!:).)*$')):
if 'href' in link.attrs:
print(link.attrs['href'])
else:
print('not in it')
  • 打印内容如下:

  • 高级一点定义一个方法,只需要传入参数url即可

  • 这次打印时为每个抓取的链接添加上以及内容


def getLinks(url):
try:
html = urlopen(url)
except (HTTPError, URLError) as e:
print(e)
bsObj = BeautifulSoup(html, 'lxml')
return bsObj.find('dd', {'class': 'desc'}).find_all('a', href=re.compile('^((/view/)*(/subview/)*)((?!:).)*$')) linkTest = getLinks('http://baike.baidu.com/link?url=FfHqPzChV9Iz7Kz0d2Mke-1njFShGt8fsFJ5mmyh-t48rnjLMbQNyeBFfmUz3oOCVvRSt0GHJ-nXDqbq9bgrZldbYDPUiQBNckuTBiGt-2Uss1aIWbhj7ELhOfrF3XoFeK2I0mSJ1ERslKeS0wUXtK')
for link in linkTest:
if 'href' in link.attrs:
print('http://baike.baidu.com' + link.attrs['href'] + ' -- ' + link.get_text())
else:
print('not in it')
  • 打印结果如下:

练习抓取百度百科中人物 以及 人物 的老婆 或者 老公 就以 凯文·贝肯为例子

  • 要抓取的界面链接如图:

  • 打开网页检查查看代码如图:

  • 由于div标签的属性class="viewport"id="slider_relations是唯一的则先找到这个目标标签div -- bsObj.find_all('div', {'class': 'viewport','id':'slider_relations'})

  • 紧接着在目标标签div下查找标签a -- find_all('a'),找到后获取href属性children['href']并返回.

  • 其中不太了解的是 bsObj.find_all('div', {'class': 'viewport','id':'slider_relations'})[0].find_all('a')[0]两个中括号[0]取值是什么原理? 个人理解是 list -- 角标提取元素

  • 得到凯文·贝肯他老婆的链接后直接带入方法getLinks(url)得到凯文·贝肯,顺便在方法中打印出来各自链接对应的名字print(children.get_text())


# 百度百科夫妻
def getLinks(url):
try:
html = urlopen(url)
except (HTTPError, URLError) as e:
print(e)
bsObj = BeautifulSoup(html, 'lxml')
children = bsObj.find_all('div', {'class': 'viewport','id':'slider_relations'})[0].find_all('a')[0]
print(children.get_text())
return children['href'] newLink = getLinks('http://baike.baidu.com/link?url=FfHqPzChV9Iz7Kz0d2Mke-1njFShGt8fsFJ5mmyh-t48rnjLMbQNyeBFfmUz3oOCVvRSt0GHJ-nXDqbq9bgrZldbYDPUiQBNckuTBiGt-2Uss1aIWbhj7ELhOfrF3XoFeK2I0mSJ1ERslKeS0wUXtK')
print(newLink)
newLinkTwo = getLinks(newLink)
print(newLinkTwo)
  • 打印结果如下:

python3 - 通过BeautifulSoup 4抓取百度百科人物相关链接的更多相关文章

  1. Python抓取百度百科数据

    前言 本文整理自慕课网<Python开发简单爬虫>,将会记录爬取百度百科"python"词条相关页面的整个过程. 抓取策略 确定目标:确定抓取哪个网站的哪些页面的哪部分 ...

  2. python抓取百度百科点赞数等动态数据

    利用selenium 模拟浏览器打开页面,加载后抓取数据 #!/usr/bin/env python # coding=utf-8 import urllib2 import re from bs4 ...

  3. C#运用实例.读取csv里面的词条,对每一个词条抓取百度百科相关资料,然后存取到数据库

    第一步:首先需要将csv先装换成datatable,这样我们就容易进行对datatable进行遍历: /// 将CSV文件的数据读取到DataTable中 /// CSV文件路径 /// 返回读取了C ...

  4. python抓取360百科踩过的坑!

    学习python一周,学着写了一个爬虫,用来抓取360百科的词条,在这个过程中.因为一个小小的修改,程序出现一些问题,又花了几天时间研究,问了各路高手,都没解决,终于还是自己攻克了,事实上就是对lis ...

  5. Python开发简单爬虫(二)---爬取百度百科页面数据

    一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格 ...

  6. selenium-java web自动化测试工具抓取百度搜索结果实例

    selenium-java web自动化测试工具抓取百度搜索结果实例 这种方式抓百度的搜索关键字结果非常容易抓长尾关键词,根据热门关键词去抓更多内容可以用抓google,百度的这种内容容易给屏蔽,用这 ...

  7. Python——爬取百度百科关键词1000个相关网页

    Python简单爬虫——爬取百度百科关键词1000个相关网页——标题和简介 网站爬虫由浅入深:慢慢来 分析: 链接的URL分析: 数据格式: 爬虫基本架构模型: 本爬虫架构: 源代码: # codin ...

  8. Python爬虫之小试牛刀——使用Python抓取百度街景图像

    之前用.Net做过一些自动化爬虫程序,听大牛们说使用python来写爬虫更便捷,按捺不住抽空试了一把,使用Python抓取百度街景影像. 这两天,武汉迎来了一个德国总理默克尔这位大人物,又刷了一把武汉 ...

  9. C#.Net使用正则表达式抓取百度百家文章列表

    工作之余,学习了一下正则表达式,鉴于实践是检验真理的唯一标准,于是便写了一个利用正则表达式抓取百度百家文章的例子,具体过程请看下面源码: 一:获取百度百家网页内容 public List<str ...

随机推荐

  1. 使用USBASP给Arduino烧写bootloader教程

    源:使用UsbAsp给UNO烧写bootloader ATMEGA16U2.ATMEGA328P固件烧写教程 arduino板由于操作不发导致固件损坏,或者想更新固件怎么办?今天给大家介绍一下如何使用 ...

  2. Rest之路 -- 从第二个Rest application里面分析 Rest 方法

    引言 在此之前,我们实现了第一个Rest application,通过分析她,我们了解了 Rest 程序的基本要素:这里,我们将会对第一个 Rest application 的功能进行扩充(实现 CR ...

  3. USB自定义HID设备实现-STM32

    该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...

  4. 2016年最全面的VR资源盘点,不只有VR视频播放器还有具体到步骤的VR资源

    2016年过去了,有多少人开始使用VR来观看我们喜欢的视频资源呢?比传统视频更高的沉浸感,甚至在VR眼镜的视角中,自己仿佛化生成视频中的主角一般.然而,这种体验只有VR眼镜还是不行的,还需要有一个VR ...

  5. STM32串口寄存器操作(转)

    源:STM32串口寄存器操作 //USART.C /************************************************************************** ...

  6. mongodb 查询时没有索引报错(too much data for sort() with no index)

    报错信息: .... too much data for sort() with no index.... 给对应排序字段加索引就OK 了... 在对应"表"名上,右键--> ...

  7. JavaScript定时机制、以及浏览器渲染机制 浅谈

    昨晚,朋友拿了一道题问我: a.onclick = function(){ setTimeout(function() { //do something ... },0); }; JavaScript ...

  8. C# Winform窗口之间传值的多种方法浅析(转)

    摘要http://www.jb51.net/article/63837.htm 这篇文章主要介绍了C# Winform窗口之间传值的多种方法浅析,本文起讲解了通过构造器传值.通过属性传递.通过事件携带 ...

  9. IOS Cell重用机制

    重用机制: -(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *) ...

  10. 内容页获取当前栏目的上一级栏目ID

    发现V9在列表页可以用$parentid 得到当前栏目的父级ID,但在内容页这个函数的值却为空了,需要按下面的写法才行, V9 在内容页获取当前栏目的上一级栏目ID {$CAT[parentid]} ...