BeautifulSoup4
BeautifulSoup4 - 根据响应结果解析页面,提取数据
首先需下载:BeautifulSoup4,requests
注意:因为BeautifulSoup是被封装在bs4里面的,所以我们需要从bs4引入模块
下面我们一起来使用 BeautifulSoup + requests 爬取中国新闻网来实践一下
from bs4 import BeautifulSoup
import requests
user-agent怎样获取的这里我就不多说了,大家应该都知道哈,下面接着来
URL = f'https://www.chinanews.com.cn/scroll-news/news1.html'
# headers = {} --> 字典
# headers是给爬虫提供伪装的
# User-Agent --> 将爬虫伪装成游览器
Headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
}
response = requests.get(url=URL, headers=Headers)
response.status_codes:是请求页面后返回来的状态码
# 这里我们对比页面返回的状态码是否等于200
if response.status.code == 200:
# 请求成功后,我们可以打印页面源码是否正常
# print(response.text)
# 如果出现乱码可查看网页charset是哪种编码格式,这里的我看了是utf-8
response.encoding = 'utf-8'
BeautifulSoup(源码, 解析器) - 将字符串类型的源代码转换为bs4类型
bs模块提供了一系列提取数据的方法,这些方法的操作对象的bs4类型的数据
soup = BeautifulSoup(response.text, 'html.parer'
)
'''
select:根据css选择器(标签,class,id等)定位数据,
得到的是符合这个选择器的所有结果(整体是一个列表,
每一个元素是bs4类型的数据)
select_one:根据css选择器(标签,class,id等)定位数据,
得到的是符合这个选择器的一个结果(是一个bs4类型的数据)
'''
li_list = soup.select('body > div.w1280.mt20 > .content-left > .content_list > ul > li')
for i in li_list:
'''
text:从bs4类型中提取标签内的内容,结果为str
attrs:从bs4类型数据中提取标签内容属性值
'''
if i.select_one('li > div.dd_lm > a') != None:
new_type = i.select_one('li > div.dd_lm > a').text
# print(new_type)
new_title = i.select_one('li > div.dd_bt > a').text
# print(new_title)
new_href = 'https://www.chinanews.com.cn' + i.select_one('li > div.dd_bt > a').attrs['href']
# print(new_href)
new_time = i.select_one('li > div.dd_time').text
由于这个新闻网有10页那么我们就需要将page进行变换,只需要放进循环即可
下面是全部代码:
import csv
import requests
from bs4 import BeautifulSoup
news_list = []
for page in range(1, 11):
print(f'-----------第{page}页-------------')
URL = f'https://www.chinanews.com.cn/scroll-news/news{page}.html'
Headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
}
response = requests.get(url=URL, headers=Headers)
if response.status_code == 200:
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, "html.parser")
li_list = soup.select('body > div.w1280.mt20 > .content-left > .content_list > ul > li')
for i in li_list:
if i.select_one('li > div.dd_lm > a') != None:
new_type = i.select_one('li > div.dd_lm > a').text
# print(new_type)
new_title = i.select_one('li > div.dd_bt > a').text
# print(new_title)
new_href = 'https://www.chinanews.com.cn' + i.select_one('li > div.dd_bt > a').attrs['href']
# print(new_href)
new_time = i.select_one('li > div.dd_time').text
# print(new_time)
lin = [new_type, new_title, new_href, new_time]
print(lin)
运行结果如下:
:到这里就结束了,大家可以把爬取出来的数据保存到本地文件里,在下一章节我将为大家讲解如何保存将数据保存到本地文件