(1)目标网站为:https://www.qiushibaike.com/text/
(2)爬取目标网站10页内容
(3)爬取内容包括:作者和内容
(4)保存在字典中,格式如下:
{
1:{ '作者':'。。。',
'内容':'。。。。。。',
}
……
}
(5)将内容转换为JSON保存在文本中
1,首先对网页url进行分析确定前10页的url.
2,引用 requests bs4 json库。
3,写主函数 主函数下面有 请求url的函数 将 内容 作为参数交给 bs4 做处理(需要确定网页标签) 得到最终数据 做持久化保存。
import requests
from bs4 import BeautifulSoup as BS
import json
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"
}
#ua伪装
text='https://www.qiushibaike.com/text'
count_num=1
def get_html(url):
html=requests.get(url,headers=headers)
#请求url
return html.text
#返回整页的数据,请求多少页返回多少页的数据。
def bs_html(text_content,content_dict):
global count_num
soup=BS(text_content,'html.parser')
#是要bs库里面的html.parser方法对text_content进行排序(text_content就是爬取的页面的html)
soup_list=soup.select('#content .article ')
#使用bs里的select这个方法找到页面里面标签。
for item in soup_list:
#循环这个整体标签(这是整个页面,我们需要里面的某些数据)
biaoti=item.select_one('.author a h2')
#item作为临时变量,每循环一次都要在里面提取出整体标签下的 h2 标签,这个就是标题,赋值给前面biaoti这个变量
if biaoti:
biaoti = biaoti.text.strip()
else:
biaoti='匿名用户'
content=item.select_one('a .content span').text.strip()
#整体标签下的内容也是上述方法,提取出来
content_dict[count_num]={'作者':biaoti,'内容':content}
#使用这个空字典 前面加上计数器 后面是字典形式 每循环一次对应的计数+1
count_num += 1
return content_dict
#返回整个字典
def save_text(text_list):
#保存文件函数
with open('rut.txt','w',encoding='utf8')as f:
#这个文件不存在 以写的方式打开就自动创建 起个别名f
f.write(text_list)
#对f进行保存 保存处理后的字典
f.close()
#保存后关闭文件
def main(num):
content_dict={}
#定义空字典
for i in range(1,num+1):
#循环次数 num是形参
url=text+'/page{}/'.format(i)
#最终的url 对初始的url进行拼接 ,最终得到10页子url
text_content=get_html(url)
#对url请求,返回的数据赋值给 text_content这个变量,作为bs函数的参数。
text_list=bs_html(text_content,content_dict)
#bs函数对整体的网页数据,空字典进行处理,当作两个参数放进去,上面bs函数处理好后返回整个字典,赋值给text_list这个变量
save_text(json.dumps(text_list,ensure_ascii=False))
#对数据保存前还要进行处理,参数是bs处理后的字典 去掉ascii这个编码格式,保存时使用utf8格式
if __name__ == '__main__':
main(10)