python爬虫实战——爬取腾讯新闻 !

 一、HTTP请求

无论我们通过浏览器打开网站、访问网页,还是通过脚本对URL网址进行访问,本质上都是对HTTP服务器的请求,浏览器上所呈现的、控制台所显示的都是HTTP服务器对我们请求的响应。

以打开腾讯新闻官网为例,我们在地址栏输入“http://news.qq.com/”,浏览器上呈现的是下图:

Python学习交流群:1004391443,这里有资源共享,技术解答,还有小编从最基础的Python资料到项目实战的学习资料都有整理,希望能帮助你更了解python,学习python。

按F12打开网页调试工具,选择“network”选项卡,可以看到我们对http://news.qq.com/的请求,以及http://news.qq.com/给我们的响应:

扫描二维码关注公众号,回复: 6210951 查看本文章

 二、用Python进行HTTP请求:

1 .打开代码编辑器,输入以下代码:

这样,就完成了一个简单的对 news.qq.com 的HTTP请求。

 我们看看这个请求的状态码:

结果返回的是:200

再看看响应的主体消息:

data.content

结果返回了一大串编码了的HTML源码,这些HTML源码未经解码和解析,看上起很是凌乱 , 对这些凌乱的html源码进行处理,则就需要使用到BeautifulSoup模块了。

 三、爬取腾讯新闻

首先在使用python的第三方库之前要导入requests和BeautifulSoup,其中requests是一个方便、简洁、高效且人性化的HTTP请求库, BeautifulSoup是HTML解析库。

# 引入相关模块
import requests
from bs4 import BeautifulSoup

写这个爬虫首先要获得该网页的html代码,然后用BeautifulSoup库进行解析,然后再分析一下腾讯新闻的html结构。

1 .寻找数据特征

腾讯新闻的网址URL为:http://news.qq.com/

我们打开网页看看:

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

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

它上一级元素为:

# 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)

运行爬取结果:

代码解析:

1)# coding:utf-8

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

2)import requests from bs4 import BeautifulSoup

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

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

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

4) wbdata = requests.get(url).text

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

5)soup = BeautifulSoup(wbdata,'lxml')

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

6)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()表示获取标签的文本信息。

这样,一个简单的腾讯新闻爬虫就完成了

猜你喜欢

转载自blog.csdn.net/weixin_39108368/article/details/90141959