本文共 1938 字,大约阅读时间需要 6 分钟。
腾讯新闻的网址URL为:
网页显示界面如下:
需要爬取这个页面每一条新闻的标题,鼠标右击一条新闻的标题,选择“审查元素”,下图的部分就是第一条新闻标题在HTML中的结构、位置和表现形式:
它上一级元素为:<em class="f14 l24">,再上一级元素为:<div class="text">我们再看另一条新闻的标题,发现它的结构和之前我们分析的新闻标题的结构是一样的:
通过这些信息,就可以确定新闻标题在HTML文档中的位置。接下来,开始使用Python对腾讯新闻标题进行爬取。
# coding:utf-8# 引入相关模块import requestsfrom bs4 import BeautifulSoupurl = "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和Python内置的解析器,以及它们的优缺点:
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") |
|
|
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
|
|
# coding:utf-8
首先,我们定义了文件的编码形式为UTF-8,以避免一些编码错误导致中文乱码。
import requestsfrom 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()表示获取标签的文本信息。
这样,一个简单的腾讯新闻爬虫就完成了。