1、寻找数据特征腾讯新闻的网址URL为:http://news.qq.com/ 网页显示界面如下: 
需要爬取这个页面每一条新闻的标题,鼠标右击一条新闻的标题,选择“审查元素”,下图的部分就是第一条新闻标题在HTML中的结构、位置和表现形式: 
它上一级元素为:<em class="f14 l24">,再上一级元素为:<div class="text">我们再看另一条新闻的标题,发现它的结构和之前我们分析的新闻标题的结构是一样的: 通过这些信息,就可以确定新闻标题在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) 运行结果部分如下: 
注:如果没有安装lxml库将无法正常运行,可能会出现Traceback (most recent call last): File "C:\Users\ADMINI~1\AppData\Local\Temp....这样的错误,安装方法很简单,输入 pip install lxml即可。 
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .
下表列出了lxml和Python内置的解析器,以及它们的优缺点:
| 解析器 | 使用方法 | 优势 | 劣势 |
|---|
| Python标准库 | BeautifulSoup(markup, "html.parser") | - Python的内置标准库
- 执行速度适中
- 文档容错能力强
| - Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
| | lxml HTML 解析器 | BeautifulSoup(markup, "lxml") | | |
3、代码分析
首先,我们定义了文件的编码形式为UTF-8,以避免一些编码错误导致中文乱码。
import requests from bs4 import BeautifulSoup
然后,我们引入了相关的模块,requests用于HTTP请求,BeautifulSoup用于解析HTML响应。
url = "http://news.qq.com/"
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()表示获取标签的文本信息。
这样,一个简单的腾讯新闻爬虫就完成了。
|