Python爬虫实战入门三:简单的HTML解析—爬取腾讯新闻

简单HTML解析——爬取腾讯新闻

上一章咱们使用Python实现了一个简单的HTTP请求,瞧着简单,爬虫就是模拟人打开一个个URL浏览一个个网页来爬取数据的,一个成功的HTTP请求,就是一个爬虫的基础。 接下来,咱们以一个实际的例子:爬取百度新闻,来介绍使用BeautifulSoup对HTML进行解析处理。

1、寻找数据特征

腾讯新闻的网址URL为:http://news.qq.com/ 我们打开网页看看:

我们需要爬取这个页面每一条新闻的标题。 鼠标右击一条新闻的标题,选择“审查元素”,出现下图的窗口:

图片中红框的位置就是那一条新闻标题在HTML中的结构、位置和表现形式:

<a target="_blank" class="linkto" href="http://news.qq.com/a/20170104/001280.htm">北京2016年39天重污染 PM2.5仍超国标一倍</a>

它上一级元素为:<em class="f14 l24">,再上一级元素为:<div class="text"> 我们再看另一条新闻的标题,发现它的结构和之前我们分析的新闻标题的结构是一样的:

<div class="text">
<em class="f14 l24">
<a target="_blank" class="linkto" href="http://news.qq.com/a/20170104/000968.htm">台拟将蔡英文贺岁春联“自自冉冉”一词列入辞典
</a>
</em>
</div>

通过这些信息,我们就可以确定新闻标题在HTML文档中的位置。 接下来,我们开始使用Python对腾讯新闻标题进行爬取

2、编写爬取代码

首先上完整的代码

# coding:utf-8
 
# 引入相关模块
import requests
from bs4 import BeautifulSoup
 
url = "http://news.qq.com/"
# 请求腾讯新闻的URL,获取其text文本
wbdata = requests.get(url).text
# 对获取到的文本进行解析
soup = BeautifulSoup(wbdata,'lxml')
# 从解析文件中通过select选择器定位指定的元素,返回一个列表
news_titles = soup.select("div.text > em.f14 > a.linkto")
 
# 对返回的列表进行遍历
for n in news_titles:
    # 提取出标题和链接信息
    title = n.get_text()
    link = n.get("href")
    data = {
        '标题':title,
        '链接':link
    }
    print(data)

运行程序,获取到的部分结果为如下所示:

C:\Python34\python.exe H:/python/scrap/scrap_tech_book/scrap_tennetNews.py
{'标题': '2017年首个断崖降级官员曝光 他犯了什么事?', '链接': 'http://news.qq.com/a/20170104/002209.htm'}
{'标题': '湄公河武装执法纪实:队员吃饭都要死死盯着前方', '链接': 'http://news.qq.com/a/20170104/007148.htm'}
{'标题': '河南台前县出台彩礼“指导标准”:总数不得高于6万', '链接': 'http://news.qq.com/a/20170104/001693.htm'}
{'标题': '摆射击摊获刑老太谈上诉原因:怕预订的咸菜浪费了', '链接': 'http://news.qq.com/a/20170104/013261.htm'}
{'标题': '美国联军承认在叙伊有“误伤”:打死近二百平民', '链接': 'http://news.qq.com/a/20170104/005283.htm'}
{'标题': '辽宁黑山企业人员退休先缴四百元:未经省级审批', '链接': 'http://news.qq.com/a/20170104/006323.htm'}
{'标题': '罗布泊遇难者李中华的骨灰回家:身份仍有3大谜团', '链接': 'http://news.qq.com/a/20170104/003139.htm'}
{'标题': '嫌楼上邻居吵,这家人买“震楼神器”反击', '链接': 'http://news.qq.com/a/20170104/001582.htm'}
{'标题': '12岁女孩疑似被弃 因妈妈买不起她的火车票?', '链接': 'http://news.qq.com/a/20170104/004622.htm'}
{'标题': '向美国商务部说“NO” 这家中国民企打赢美国官司', '链接': 'http://news.qq.com/a/20170104/000322.htm'}
{'标题': '台拟将蔡英文贺岁春联“自自冉冉”一词列入辞典', '链接': 'http://news.qq.com/a/20170104/000968.htm'}
{'标题': '新华社:姚明资历经验尚浅 任篮协主席尚有障碍', '链接': 'http://news.qq.com/a/20170104/000330.htm'}
{'标题': '新京报:法院拍卖BB弹玩具枪,自己人也糊涂?', '链接': 'http://news.qq.com/a/20170104/001344.htm'}

这正是我们所需要的。 虽然代码很简单,但还是做一点点讲解,方便刚刚接触的同学。

3、代码解析

# coding:utf-8

首先,我们定义了文件的编码形式为UTF-8,以避免一些编码错误导致中文乱码。

import requests
from bs4 import BeautifulSoup

然后,我们引入了相关的模块,requests用于HTTP请求,BeautifulSoup用于解析HTML响应。

url = "http://news.qq.com/"

设置一个变量url,值为腾讯新闻的URL

wbdata = requests.get(url).text

使用requests.get()对URL发起GET方式的HTTP请求,并使用text()方法获取响应的文本内容,最后将其赋值给变量wbdata。

soup = BeautifulSoup(wbdata,'lxml')

使用BeautifulSoup对响应文本wbdata进行解析处理,这里使用的是lxml库,如何没有安装,可以使用Python自带的html.parser,效果也是一样的。

news_titles = soup.select("div.text > em.f14 > a.linkto")

在解析后的文本中,使用select选择器,在文本中选择指定的元素,通常我们还会使用find()和findall()方法来进行元素选择。 这一步返回的为一个列表,列表内的元素为匹配的元素的HTML源码。

for n in news_titles:   
 # 提取出标题和链接信息    
  title = n.get_text()    
  link = n.get("href")    
  data = {'标题':title,'链接':link}    
  print(data)

对结果列表进行遍历,再从遍历的元素中提取出数据,get("href")表示获取属性名为“href”的属性值,get_text()表示获取标签的文本信息。

这样,一个简单的腾讯新闻爬虫就完成了,如果对requests模块和BeautifulSoup模块有更加深的学习欲望,可以查看它们的官方文档: requests官方文档(中文): http://docs.python-requests.org/zh_CN/latest/ BeautifulSoup文档(中文): https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

州的先生:爬虫、数据采集、分析

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-01-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网杂技

前端各种优化

1.  请减少HTTP请求   基本原理:   在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突...

3338
来自专栏iOS开发笔记

ios开发照片框架详解(一)-- AssetsLibrary

1 概要 在 iOS 设备中,照片和视频是相当重要的一部分。最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法。在 i...

3679
来自专栏Golang语言社区

开发者必备的12个JavaScript库

现在 web 设计是最有趣的了,做好 web 设计不仅要熟练使用 Javascript,css 和 html 等,还要有自己的创意设计。为了方便大家发挥自己的创...

3269
来自专栏NetCore

View-ForumsGroupView.ascx 读解

为了修改首页的框架,一路跟踪到了View-ForumsGroupView.ascx这个文件,其实他就是一个页面的模版,微软在这里并没有弄了太多花絮,所以阅读起来...

2116
来自专栏nice_每一天

一天带你入门到放弃vue.js(一)

每个新的框架入手都会进行一些列的扯犊子!这里不多说那么多!简简单单说一下vue吧!

1492
来自专栏Nian糕的私人厨房

CSS 字体图标引用

在自己的项目中,我们或多或少的需要插入一些 icon,缺少 UI 设计天赋的我只能去搜寻现有的 icon 了,在这里推荐大家去 Iconfont 阿里巴巴矢量图...

923
来自专栏lgp20151222

Java引用外部字体(路径引用)的一些坑

然后,一路踩了jvm关于字体的坑,重点是,java的报错很随意,甚至不报错,建议直接看最后面.

1411
来自专栏liuchengxu

如何使用 Vim 的 help

实际上,无论是 Vim 的基础知识还是进阶知识,大都可以从 help 中找到指引。但是我想很多人并没有意识到这一点,或者并没有重视这一点。RTFM (read ...

652
来自专栏ionic3+

【组件篇】ionic3分组索引及锚点滚动列表

好久没有写文章了,趁着吃完饭消化的时候打算写一篇。先前一篇文章提到并关注的capacitor终于出到1.0.0-alpha.5了,本想写它,但是内容比较多,所以...

1402
来自专栏极乐技术社区

微信小程序 wx.request 的封装

自学转行到前端也已近两年,也算是简书和掘金的忠实粉丝,但是以前一直惜字如金(实在是胆子小,水平又低),现在我决定视金钱如粪土(就只是脸皮厚了,水平就那样),好了...

5978

扫码关注云+社区