怎么用BeautifulSoup爬取网页内容

  介绍

这篇文章主要讲解了“怎么用BeautifulSoup爬取网页内容”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习”怎么用BeautifulSoup爬取网页内容”吧!

最近要做一个食品安全方面的项目,需要爬取新闻。于是想到之前用BeautifulSoup爬虫还是非常方便的,今天正好试了一下,可行。

爬取的链接如下:http://news.sohu.com/1/0903/61/subject212846158.shtml

结构如下:

怎么用BeautifulSoup爬取网页内容

从第二页开始的链接格式是:http://news.sohu.com/1/0903/61/subject212846158_1091.shtml

逐页递减(1090年即1091年,如此)。

需要的内容:标题,时间,来源,作者,全文。

准备:urllib2, BeautifulSoup, lxml

先引入这几个库

 <代码>进口urllib2 
从bs4进口BeautifulSoup进口lxml
  

先用开发者工具得到标题(当然我们这里不用头也可以)

 <代码>头={
,,“User-Agent":“ozilla/5.0(麦金塔电脑;Intel Mac OS X 10 _12_2) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/60.0.3112.113 Safari 537.36“}
  
 <代码> 


 def  sina_news (url,我):
  ,,,request =, urllib2.Request (url,头=标题)
  ,,,#发送请求,带标头
  ,,,response =, urllib2.urlopen(请求)
  ,,,#得到的反应
  ,,,html_doc =, response.read ()
  ,,,#读取得到HTML文件
  ,,,soup =, BeautifulSoup (html_doc & # 39; lxml # 39;)
  ,,,#对HTML使用lxml解析器进行解析
  ,,,titles =, soup.select (& # 39; td.newsblue1 祝辞,答:nth-of-type (& # 39; + str (i) + & # 39;) & # 39;)
  ,,,#利用选择器获得冠军
  ,,,time =, soup.select (& # 39; td.newsblue1 祝辞,跨度:nth-of-type (& # 39; + str (i) + & # 39;) & # 39;)
  ,,,#同上
  ,,,print 标题[0].get_text ()
  ,,,#由于选择返回的是表,表的第一个元素是我们要的,所以标题[0].get_text()是为了去掉一些HTML代码,只得到内容值
  ,,,print 时间[0].get_text ()
  ,,,print 标题[0][& # 39;href # 39;] 
  

利用选择器进行解析的时候是用到了开发者工具的定位功能,定位元素后,右键 copy-selector即可,当然要注意nth-child (x)需要改成nth-of-type (x)在这里我们用了

 nth-of-type (& # 39; + str (i) + & # 39;) & # 39;) 
  

这样的表达方式,是因为在该页面的结构中,新闻是以子项目排列的。如第一条就是nth-of-type(1),第二条就是nth-of-type(2),如此列推。测试一下结果:


 <代码>我的范围(1201):
,,sina_news (& # 39; http://news.sohu.com/1/0903/61/subject212846158.shtml& # 39; i)
  

结果如下:

怎么用BeautifulSoup爬取网页内容

现在仅仅是解决了标题,时间,链接,我们还有来源,作者。但是我们已经获得了每一条新闻的链接,那么这就很好办了。

我们先看一下每一条新闻的结构:

怎么用BeautifulSoup爬取网页内容

怎么用BeautifulSoup爬取网页内容

同理,很容易就能提取出来源,责任编辑。代码如下:

 <代码> def get_source (url): 
,,请求=urllib2.Request (url,头=头)
,,反应=urllib2.urlopen(请求)
,,html_doc=response.read ()
,,汤=BeautifulSoup (html_doc & # 39; lxml # 39;)
,,来源=soup.select (& # 39; # media_span& # 39;)
,,编辑=soup.select (& # 39; # editor_baidu& # 39;)
, 之前   

在原来的函数中增加如下代码:

来源,editor =, get_source(标题[0][& # 39;href # 39;]) 
  ,
 <代码>如果(来源):
,,打印来源[0].get_text ()
如果(编辑):
,,打印编辑[0].get_text()
  

由于来源和责任编辑不一定每一条新闻都有,因此这里加了一个判断条件。现在看看效果。

怎么用BeautifulSoup爬取网页内容

效果还可以,再提取所有页面的内容

 <代码> def get_singalpage_all (url): 

怎么用BeautifulSoup爬取网页内容