- requests - 请求页面,得到响应结果
- BeautifulSoup4 - 根据响应结果解析页面、提取数据
- 写入文件、数据库
引用模块
import requests from bs4 import BeautifulSoup
注:bs4 -> BeautifulSoup5,bs4模块能从html或者xml中提取数据
我们对中国新闻网进行解析
for page in range(1, 11):
print(f'第{page}页')
URL = f'https://www.chinanews.com.cn/scroll-news/news{page}.html'
引入Headers
在日常爬网页的时候,为了不让网页发现我们在做爬虫操作,我们可以引入Headers,在我们要爬取的网页里可以找到Headers属性,这样网页会认为我们是正常浏览数据,就不容易被拒绝我们的爬虫申请。
Headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
response = requests.get(url=URL, headers=Headers)
# 如果状态码为200,爬虫可用
if response.status_code == 200:
response.encoding = 'UTF-8'
# 打印源代码(字符串)
print(response.text)
为什么要对比打印结果和网页中的内容是否一致?
- 网页:分为静态页面和动态页面
- 静态页面:内容是写死的,除非人为的进行修改,否则这个页面的内容是一成不变的
- 动态页面:内容不是写死的,使用某种特殊技术(JavaScript)使数据通过某种方式显示在页面中
requests得到的结果是静态页面的结果。
soup = BeautifulSoup(response.text, 'html.parser')
li_list = soup.select(
'body > div.w1280.mt20 > div.content-left > div.content_list > ul > li')
# print(li_list, type(li_list))
for i in li_list:
# print(i)
if i.select_one('li > div.dd_lm > a') != None:
# .text直接提取标签的内容
news_type = i.select_one('li > div.dd_lm > a').text
# print(news_type, type(news_type))
news_title = i.select_one('li > div.dd_bt > a').text
# print(news_title)
news_href = 'http://www.chinanews.com.cn' + i.select_one('li > div.dd_bt > a').attrs['href']
# print(news_href)
news_time = i.select_one('li > div.dd_time').text
print(news_type, news_title, news_href, news_time)
li_list = soup.select(
'body > div.w1280.mt20 > div.content-left > div.content_list > ul > li')
此代码是如何来的呢,选中一条新闻右键查看,就可以看到HTML源代码的块级别,跟着所包含的块像剥洋葱那样一层层下来,我们称为父子选择,在前端笔记中投讲到,精确到哪个部分就会取到哪部分的新闻,可以取到多条新闻。
注:
- select:根据CSS选择器定位数据(标签、class、id等)定位数据,得到的是符合这个选择器的所有结果(整体是列表,列表中每个元素是一个bs4类型的数据)
- select_one:根据CSS选择器定位数据(标签、class、id等)定位数据,得到的是符合这个选择器的一个结果(是一个bs4类型的数据)
- text:从bs4类型数据中提取标签内的内容,结果为str
- attrs:从bs4类型数据中提取标签内容属性值,结果为str`
(代码从上而下为完整代码,使用时注意缩进,现在只获取了网页源代码,并没有读取数据)



