哈哈,其实很简单,寥寥几行代码网页爬一部小说,不卖关子,立刻开始。

首先安装所需的包,requests,BeautifulSoup4

控制台执行

pip install requests

pip install BeautifulSoup4

如果不能正确安装,请检查你的环境变量,至于环境变量配置,在这里不再赘述,相关文章有很多。

两个包的安装命令都结束后,输入pip list

可以看到,两个包都成功安装了。

好的,我们立刻开始编写代码。

我们的目标是抓取这个链接下所有小说的章节 https://book.qidian.com/info/1013646681#Catalog

我们访问页面,用chrome调试工具查看元素,查看各章节的html属性。我们发现所有章节父元素是<ul class="cf">这个元素,章节的链接以及标题,在子<li>下的<a>标签内。

那我们第一步要做的事,就是要提取所有章节的链接。

'用于进行网络请求'
import requests chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog")
print(chapter.text)

页面顺利的请求到了,接下来我们从页面中抓取相应的元素

'用于进行网络请求'
import requests
'用于解析html'
from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text)
'提取class为cf的ul标签'
ul = ul_bs.find_all("ul",class_="cf")
print(ul)

ul也顺利抓取到了,接下来我们遍历<ul>下的<a>标签取得所有章节的章节名与链接

'用于进行网络请求'
import requests
'用于解析html'
from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text)
'提取class为cf的ul标签'
ul = ul_bs.find_all("ul",class_="cf")
ul_bs = BeautifulSoup(str(ul[0]))
'找到<ul>下的<a>标签'
a_bs = ul_bs.find_all("a")
'遍历<a>的href属性跟text'
for a in a_bs:
href = a.get("href")
text = a.get_text()
print(href)
print(text)

ok,所有的章节链接搞定,我们去看想想章节详情页面长什么样,然后我们具体制定详情页面的爬取计划。

打开一个章节,用chrome调试工具审查一下。文章标题保存在<h3 class="j_chapterName">中,正文保存在<div class="read-content j_readContent">中。

我们需要从这两个标签中提取内容。

'用于进行网络请求'
import requests
'用于解析html'
from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text)
'提取class为cf的ul标签'
ul = ul_bs.find_all("ul",class_="cf")
ul_bs = BeautifulSoup(str(ul[0]))
'找到<ul>下的<a>标签'
a_bs = ul_bs.find_all("a") detail = requests.get("https:"+a_bs[0].get("href"))
text_bs = BeautifulSoup(detail.text)
text = text_bs.find_all("div",class_ = "read-content j_readContent")
print(text)

正文页很顺利就爬取到了,以上代码仅是用第一篇文章做示范,通过调试文章已经可以爬取成功,所有下一步我们只要把所有链接遍历逐个提取就好了

'用于进行网络请求'
import requests
'用于解析html'
from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text)
'提取class为cf的ul标签'
ul = ul_bs.find_all("ul",class_="cf")
ul_bs = BeautifulSoup(str(ul[0]))
'找到<ul>下的<a>标签'
a_bs = ul_bs.find_all("a") '遍历所有<href>进行提取' for a in a_bs:
detail = requests.get("https:"+a.get("href"))
d_bs = BeautifulSoup(detail.text)
'正文'
content = d_bs.find_all("div",class_ = "read-content j_readContent")
'标题'
name = d_bs.find_all("h3",class_="j_chapterName")[0].get_text()

在上图中我们看到正文中的每一个<p>标签为一个段落,提取的文章包含很多<p>标签这也是我们不希望的,接下来去除p标签。

但是去除<p>标签后文章就没有段落格式了呀,这样的阅读体验很不爽的,我们只要在每个段落的结尾加一个换行符就好了

'用于进行网络请求'
import requests
'用于解析html'
from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text)
'提取class为cf的ul标签'
ul = ul_bs.find_all("ul",class_="cf")
ul_bs = BeautifulSoup(str(ul[0]))
'找到<ul>下的<a>标签'
a_bs = ul_bs.find_all("a") '遍历所有<href>进行提取' for a in a_bs:
detail = requests.get("https:"+a.get("href"))
d_bs = BeautifulSoup(detail.text)
'正文'
content = d_bs.find_all("div",class_ = "read-content j_readContent")
'标题'
name = d_bs.find_all("h3",class_="j_chapterName")[0].get_text() txt = ""
p_bs = BeautifulSoup(str(content))
'提取每个<p>标签的内容'
for p in p_bs.find_all("p"):
txt = txt + p.get_text()+"\r\n"

去掉<p>标签了,所有的工作都做完了,我们只要把文章保存成一个txt就可以了,txt的文件名以章节来命名。

'用于进行网络请求'
import requests
'用于解析html'
from bs4 import BeautifulSoup def create_txt(path,txt):
fd = None
try:
fd = open(path,'w+',encoding='utf-8')
fd.write(txt)
except:
print("error")
finally:
if (fd !=None):
fd.close() chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text)
'提取class为cf的ul标签'
ul = ul_bs.find_all("ul",class_="cf")
ul_bs = BeautifulSoup(str(ul[0]))
'找到<ul>下的<a>标签'
a_bs = ul_bs.find_all("a") '遍历所有<href>进行提取' for a in a_bs:
detail = requests.get("https:"+a.get("href"))
d_bs = BeautifulSoup(detail.text)
'正文'
content = d_bs.find_all("div",class_ = "read-content j_readContent")
'标题'
name = d_bs.find_all("h3",class_="j_chapterName")[0].get_text() path = 'F:\\test\\'
path = path + name+".txt" txt = ""
p_bs = BeautifulSoup(str(content))
'提取每个<p>标签的内容'
for p in p_bs.find_all("p"):
txt = txt + p.get_text()+"\r\n" create_txt(path,txt)
print(path+"保存成功")

文章成功爬取,文件成功保存,搞定。就这么简单的几行代码搞定。

看完python这段爬虫代码,java流泪了c#沉默了的更多相关文章

  1. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  2. 廖雪峰js教程笔记6 generator一个坑 看完python在回来填坑

    generator(生成器)是ES6标准引入的新的数据类型.一个generator看上去像一个函数,但可以返回多次. ES6定义generator标准的哥们借鉴了Python的generator的概念 ...

  3. 因一段JavaScript代码引发的闲扯

    前两天,一朋友给我发了一段JavaScript代码: function f1(){ var n=999; nAdd=function(){ n+=1 }; function f2(){ alert(n ...

  4. Python编写网页爬虫爬取oj上的代码信息

    OJ升级,代码可能会丢失. 所以要事先备份. 一開始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启示和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 p ...

  5. 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师

    为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...

  6. 图解Java线程的生命周期,看完再也不怕面试官问了

    文章首发自个人微信公众号: 小哈学Java https://www.exception.site/java-concurrency/java-concurrency-thread-life-cycle ...

  7. (转)Python新手写出漂亮的爬虫代码1——从html获取信息

    https://blog.csdn.net/weixin_36604953/article/details/78156605 Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有 ...

  8. [Python]南邮OJ代码备份爬虫

    之前看过Python学习的经验,说以project为导向学习. 自己分析了一下,一般接触Python的都有一定的其它语言基础,对于程序设计的基本逻辑,语法都有一个大概的了解.而Python这样的脚本语 ...

  9. Java引用类型原理深度剖析,看完文章,90%的人都收藏了

    本文为synchronized系列第二篇.主要内容为分析偏向锁的实现. 偏向锁的诞生背景和基本原理在上文中已经讲过了. 本文将分为几块内容: 1.偏向锁的入口 2.偏向锁的获取流程 3.偏向锁的撤销流 ...

随机推荐

  1. 执行对象Statement、PreparedStatement和CallableStatement详解 JDBC简介(五)

    执行对象是SQL的执行者,SQL是“安排好的任务”,执行对象就是“实际工作的人”. 执行对象有三种: Statement.PreparedStatement和CallableStatement,他们都 ...

  2. .Net基础——程序集与CIL

    1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll则需要被其他程序集调用执行. CIL ...

  3. Java开发笔记(七十七)使用Optional规避空指针异常

    前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...

  4. 【学习笔记】tensorflow文件读取

    目录 文件读取 文件队列构造 文件阅读器 文件内容解码器 开启线程操作 管道读端批处理 CSV文件读取案例 先看下文件读取以及读取数据处理成张量结果的过程: 一般数据文件格式有文本.excel和图片数 ...

  5. Simditor 富文本编辑器多选图片上传、视频连接插入

    simditor 是一个基于浏览器的所见即所得的文本编辑器.Simditor 富文本编辑器, 支持多选图片上传, 视频连接插入, HTML代码编辑以及常用富文本按钮,支持的浏览器:IE10.Firef ...

  6. iOS----------禁止输入汉字

    说明: ^.*[\u4e00-\u9fa5].*$ 是否包含中文^[\u4E00-\u9FA5]+$ 是否全中文 - (BOOL)textField:(UITextField *)textField ...

  7. Python 通过脚本获取Android的apk的部分属性,再通过加密算法生成秘钥。

    Python 通过脚本获取Android的apk的部分属性,再通过加密算法生成秘钥. #!/usr/bin/env python # -*- coding: utf- -*- import os im ...

  8. 小程序实践(十):textarea实现简单的编辑文本界面

    textarea是官方的原生组件,用于多行输入 简单的例子,监听文本内容.长度,以及设置最大可输入文本长度 wxml <view class='textarea-Style'> <t ...

  9. Android EditText常用属性

    一.EditText介绍 ①EditText是一个输入框,在Android开发中是常用的控件.也是获取用户数据的一种方式. ②EditText是TextView的子类,它继承了TextView的所有属 ...

  10. Node.js模块导入导出

    这篇文章本来是想模块导入导出和事件循环一起写的,但是感觉一起写的话会太长了,所以就分开两篇文章写吧.下一篇会重点介绍一下js中的事件循环,js代码到底是以何种顺序去执行的呢?我相信你看懂了事件循环再去 ...