今天看到人家广告 python爬虫兼职过万,于是心血来潮的学习了一下。写个小案例打个基础吧
用到 的三个库: requests (网络请求库), os(文件操作库) , re (正则匹配库)
这个案例是我拿图书馆一本书里的例子,然后自己写的完整代码
网络库用来 获取网页源代码和内容
文件操作库 用来对内容进行保存到本地
正则匹配库 用来对内容进行解析和截取
要爬取的页面地址 :https://www.kanunu8.com/book3/6879/
本次案例是对一个小说页面进行爬取。小说比较容易,作为新手入门合适很多
内容分析:
小说页面爬取主要三个步骤:
- 获取各个章节的连接
- 具体每个章节的文本内容获取
- 保存内容到本地文件
据此分为三个 函数 get_toc() get_article() save()
打开要爬取的地址可以看到各个章节,现在要获取其章节连接url
利用 正则匹配 a 标签 获取里边的 href 属性,并用 网址的根连接进行拼接即可
url = re.findall('href="(.*?)"',block,re.S)
image.png
进入章节的文字展示可以看到 文字都是存放在 p 标签里边的。
照样的匹配 p标签,顺便过滤掉 br标签就好了
最后就是 把内容 利用 os 进行保存即可
image.png
image.png
源码贴上:
如果报了编码格式的错误,请执行这段代码看看自己本机器的编码格式:
import locale
print(locale.getdefaultlocale())
如果是 cp936 就是 gbk 格式。 下边的代码 encoding 填写 gbk格式
# -*- coding: utf-8 -*-
import re
import requests
import os
start_url = 'https://www.kanunu8.com/book3/6879/'
def main():
html = requests.get(start_url).content.decode(encoding="gbk")
list = get_toc(html)
for l in list:
save(*get_article(requests.get(l).content.decode(encoding="gbk")))
def get_toc(html):
"""
获取每一章连接,存储到一个列表中并返回
:param html:
:return:
"""
urlList = []
block = re.findall('正文(.*?)</tbody>',html,re.S)[0]
url = re.findall('href="(.*?)"',block,re.S)
for u in url:
urlList.append(start_url+u)
return urlList
def get_article(html):
"""
获取每一章的正文并返回章节名和正文
:param html:
:return:
"""
chapter_name = re.search('size="4">(.*?)<',html,re.S).group(1)
text_block = re.search('<p>(.*?)</p>',html,re.S).group(1)
text_block = text_block.replace('<br />','')
return chapter_name,text_block
def save(chapter,article):
"""
保存内容到本地
:param chapter:
:param article:
:return:
"""
os.makedirs('动物农场',exist_ok=True)
with open(os.path.join('动物农场',chapter + '.txt'),'w',encoding='utf-8') as f:
f.write(article)
main()
网友评论