热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

whitepages爬取_爬取新笔趣阁小说!适合新手入门的小案例

爬取笔趣阁小说(搜索爬取)首先看看最终效果(gif):实现步骤:1.探查网站“http:www.xbiquge.la”,看看网站的实现原理

爬取笔趣阁小说(搜索+爬取)

首先看看最终效果(gif):

eb19bfc1ecb899360b49a601f50a4eec.gif


实现步骤:
1.探查网站“http://www.xbiquge.la/”,看看网站的实现原理。

2.编写搜索功能(获取每本书目录的URL)。

3.编写写入功能(按章节写入文件)。

4.完善代码(修修bug,建了文件夹)。

ps:所需模块 :

import requestsimport bs4 # 爬网站必备两个模块不解释import os # 用来创建文件夹的import sys # 没啥用单纯为了好看import timeimport random # 使用随机数设置延时123456

一、网站搜索原理,并用Python实现。

我本以为这个网站和一般网站一样,通过修改URL来进行搜索,结果并不然。

bd317d90e42f63b508efc969f560896b.png
dc5fd48cb69afee0e446f2d967042ee5.png


可以看出这个网站不会因搜索内容改变而改变URL
那还有一种可能:通过POST请求,来更新页面。让我们打开Network验证一下。

3de3506e4edb04b7a5b00f5633784e81.png
921b6f31621914c177700117e07a5ec0.png


我的猜想是对的。接下来开始模拟。

headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36", "COOKIE": "_abcde_qweasd=0; Hm_lvt_169609146ffe5972484b0957bd1b46d6=1583122664; bdshare_firstime=1583122664212; Hm_lpvt_169609146ffe5972484b0957bd1b46d6=1583145548", "Host": "www.xbiquge.la"} # 设置头尽量多一点 以防万一x = str(input("输入书名或作者名:")) # 通过变量来控制我们要搜索的内容data = {'searchkey': x}url = 'http://www.xbiquge.la/modules/article/waps.php'r = requests.post(url, data=data, headers=headers)soup = bs4.BeautifulSoup(r.text.encode('utf-8'), "html.parser") # 用BeautifulSoup方法方便我们提取网页内容网页123456789

可是如果现在我printf(soup)后发现里面的中文全为乱码!

b380618df6e72dfdea5b3bd3ea9f63da.png


这不难看出是编码格式不对,但我们可以用encoding方法来获取编码方式。

8d913f03d1ad75969f5e7645e5698d1c.png


改完编码后就可以正常提取了,并且和浏览器显示的一致,都是我们搜索的内容。

2ec460214a429da4d277711c1ceea695.png

二、接下来我们就来在这一堆代码里找到我们想要的内容了(书名,作者,目录URL)

通过元素审查我们很容易就可以定位到它们所在位置。

13d91537eacc3795246696fcc3d858af.png


链接和书名在"td class even" 标签里,作者在"td class=even"里。

什么!标签重名了!怎么办!管他三七二十一!先把"td class=even"全打印出来看看。

book_author = soup.find_all("td", class_="even")for each in book_author: print(each)123

可以发现每个each分为两层。

7aad22b5d79a792d2f08ad0d3eea6a79.png


那我们可以奇偶循环来分别处理这两层。(因为如果不分层处理的话第一层要用的方法(each.a.get(“href”)在第二层会报错,好像try也可以处理这个错,没试)

并且用创建两个三个列表来储存三个值。

books = [] #  书名authors = [] # 作者名directory = [] # 目录链接tem = 1for each in book_author: if tem == 1: books.append(each.text) tem -= 1 directory.append(each.a.get("href")) else: authors.append(each.text) tem += 1123456789101112

c1454750674b3b4f6e30c0e47851ab50.png


成功!三个列表全部一样对应!
那么要如何实现选择一个序号,来让Python获得一个目录链接呢?
我们可以这样:

print('搜索结果:')for num,book, author in zip(range(1, len(books)+1),books, authors): print((str(num)+": ").ljust(4)+(book+"").ljust(25) + ("作者:" + author).ljust(20))search = dict(zip(books, directory))1234

08c587142903943228fb15b049414c3f.png


是不是很神奇!“search”是我们用书名和目录URL组成的字典,我们只要return search[books[i-1]]
就可以让下一个函数得到这本书的目录URL了。

三、获取章节URL,获取文本内容,写入文件。

我们得到目录的URL后就可以用相同的方法获取每一章节的URL了(不赘述了)。

def get_text_url(titel_url): url = titel_url global headers r = requests.get(url, headers=headers) soup = bs4.BeautifulSoup(r.text.encode('ISO-8859-1'), "html.parser") titles = soup.find_all("dd") texts = [] names = [] texts_names = [] for each in titles: texts.append("http://www.xbiquge.la"+each.a["href"]) names.append(each.a.text) texts_names.append(texts) texts_names.append(names) return texts_names # 注意这里的返回值是一个包含两个列表的列表!!123456789101112131415

注意这里的返回值是一个包含两个列表的列表!!texts_names[0] 就是每一章节的 URL, texts_names[0] 是章节名
为下一个写内容的函数方便调用。
接下来接是写文件了!

search = dict(zip(books, directory))url = texts_url[0][n]name = texts_url[1][n]req = requests.get(url=url, headers=headers)time.sleep(random.uniform(0, 0.5)) # 即使设置了延迟,他还有会可能503(没办法小网站)req.encoding = 'UTF-8' # 这里的编码是UTF-8,跟目录不一样,要注意!html = req.textsoup = bs4.BeautifulSoup(html, features="html.parser")texts = soup.find_all("div", id="content")while (len(texts) == 0): # 他如果503的话,读取内容就什么都木有,那直接让他再读一次,直到读出来为止。 req = requests.get(url=url, headers=headers) time.sleep(random.uniform(0, 0.5)) req.encoding = 'UTF-8' html = req.text soup = bs4.BeautifulSoup(html, features="html.parser") texts = soup.find_all("div", id="content")else: content = texts[0].text.replace('xa0' * 8, '') content = content.replace( "亲,点击进去,给个好评呗,分数越高更新越快,据说给新笔趣阁打满分的最后都找到了漂亮的老婆哦!手机站全新改版升级地址:http://m.xbiquge.la,数据和书签与电脑站同步,无广告清新阅读!", "") # 使用text属性,提取文本内容,滤除br标签,随后使用replace方法,去掉八个空格符号,并用回车代替 再去除每一页都有得结尾with open(name + '.txt', "w", encoding='utf-8')as f: f.write(content) sys.stdout.write("已下载{}章,还剩下{}章".format(count, max - count)) # sys模块就在这用了一次,为了不让他换行。。。 count += 112345678910111213141516171819202122232425

n就是章节的序列,直接for循环就可以把所有章节写成文件了
这里处理503的方法虽然很暴力,可是是最有用的!

四、整理代码,修修bug。

把上面的思路写成三道四个函数打包一下。
然后测试一下,看看有什么bug,能修就修复,修复不了就直接try掉。(哈哈哈)
想要文件夹的可以研究研究os模块,很简单,这里不赘述了。
最后附上完整代码!

import requestsimport bs4 # 爬网站必备两个模块不解释import os # 用来创建文件夹的import sys # 没啥用单纯为了好看import timeimport random # 使用随机数设置延时headers &#61; { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36", "COOKIE": "_abcde_qweasd&#61;0; Hm_lvt_169609146ffe5972484b0957bd1b46d6&#61;1583122664; bdshare_firstime&#61;1583122664212; Hm_lpvt_169609146ffe5972484b0957bd1b46d6&#61;1583145548", "Host": "www.xbiquge.la"} # 设置头尽量多一点 以防万一b_n &#61; ""def get_title_url(): x &#61; str(input("输入书名或作者名:")) data &#61; {&#39;searchkey&#39;: x} url &#61; &#39;http://www.xbiquge.la/modules/article/waps.php&#39; global headers, b_n r &#61; requests.post(url, data&#61;data, headers&#61;headers) soup &#61; bs4.BeautifulSoup(r.text.encode(&#39;ISO-8859-1&#39;), "html.parser") book_author &#61; soup.find_all("td", class_&#61;"even") books &#61; [] #  书名 authors &#61; [] # 作者名 directory &#61; [] # 目录链接 tem &#61; 1 for each in book_author: if tem &#61;&#61; 1: books.append(each.text) tem -&#61; 1 directory.append(each.a.get("href")) else: authors.append(each.text) tem &#43;&#61; 1 print(&#39;搜索结果&#xff1a;&#39;) for num,book, author in zip(range(1, len(books)&#43;1),books, authors): print((str(num)&#43;": ").ljust(4)&#43;(book&#43;"").ljust(25) &#43; ("作者&#xff1a;" &#43; author).ljust(20)) search &#61; dict(zip(books, directory)) if books &#61;&#61; []: print("没有找到任何一本书&#xff0c;请重新输入!") get_title_url() try: i &#61; int(input("输入需要下载的序列号(重新搜索输入&#39;0&#39;)")) except: print("输入错误重新输入:") i &#61; int(input("输入需要下载的序列号(重新搜索输入&#39;0&#39;)")) if i &#61;&#61; 0: books &#61; [] authors &#61; [] directory &#61; [] get_title_url() if i>len(books) or i<0: print("输入错误重新输入:") i &#61; int(input("输入需要下载的序列号(重新搜索输入&#39;0&#39;)")) b_n&#61;books[i-1] try: os.mkdir(books[i-1]) os.chdir(b_n) except: os.chdir(b_n) b_n &#61; books[i - 1] return search[books[i-1]]def get_text_url(titel_url): url &#61; titel_url global headers r &#61; requests.get(url, headers&#61;headers) soup &#61; bs4.BeautifulSoup(r.text.encode(&#39;ISO-8859-1&#39;), "html.parser") titles &#61; soup.find_all("dd") texts &#61; [] names &#61; [] texts_names &#61; [] for each in titles: texts.append("http://www.xbiquge.la"&#43;each.a["href"]) names.append(each.a.text) texts_names.append(texts) texts_names.append(names) return texts_names # 注意这里的返回值是一个包含两个列表的列表&#xff01;&#xff01;def readnovel(texts_url): global headers,b_n count&#61;1 max&#61;len(texts_url[1]) print("预计耗时{}分钟".format((max // 60)&#43;1)) tishi &#61; input(str(b_n)&#43;"一共{}章&#xff0c;确认下载输入&#39;y&#39;,输入其他键取消".format(max)) if tishi &#61;&#61; "y"or tishi &#61;&#61;"Y": for n in range(max): url &#61; texts_url[0][n] name &#61; texts_url[1][n] req &#61; requests.get(url&#61;url,headers&#61;headers) time.sleep(random.uniform(0, 0.5)) # 即使设置了延迟&#xff0c;他还有会可能503(没办法小网站) req.encoding &#61; &#39;UTF-8&#39; # 这里的编码是UTF-8&#xff0c;跟目录不一样&#xff0c;要注意&#xff01; html &#61; req.text soup &#61; bs4.BeautifulSoup(html, features&#61;"html.parser") texts &#61; soup.find_all("div", id&#61;"content") while (len(texts) &#61;&#61; 0): # 他如果503的话&#xff0c;读取内容就什么都木有&#xff0c;那直接让他再读一次&#xff0c;直到读出来为止。 req &#61; requests.get(url&#61;url, headers&#61;headers) time.sleep(random.uniform(0,0.5)) req.encoding &#61; &#39;UTF-8&#39; html &#61; req.text soup &#61; bs4.BeautifulSoup(html, features&#61;"html.parser") texts &#61; soup.find_all("div", id&#61;"content") else: content &#61; texts[0].text.replace(&#39;xa0&#39; * 8, &#39;&#39;) content&#61;content.replace("亲,点击进去,给个好评呗,分数越高更新越快,据说给新笔趣阁打满分的最后都找到了漂亮的老婆哦!手机站全新改版升级地址&#xff1a;http://m.xbiquge.la&#xff0c;数据和书签与电脑站同步&#xff0c;无广告清新阅读&#xff01;","") # 使用text属性&#xff0c;提取文本内容&#xff0c;滤除br标签&#xff0c;随后使用replace方法&#xff0c;去掉八个空格符号&#xff0c;并用回车代替 再去除每一页都有得结尾 with open(name&#43;&#39;.txt&#39;,"w",encoding&#61;&#39;utf-8&#39;)as f: f.write(content) sys.stdout.write("已下载{}章&#xff0c;还剩下{}章".format(count,max-count)) # sys模块就在这用了一次&#xff0c;为了不让他换行。。。 count &#43;&#61; 1 print("全部下载完毕") else: print("已取消!") os.chdir(&#39;..&#39;) os.rmdir(b_n) main()def main(): titel_url &#61; get_title_url() texts_url &#61; get_text_url(titel_url) readnovel(texts_url) input("输入任意键退出")if __name__ &#61;&#61; &#39;__main__&#39;: print("小说资源全部来自于&#39;新笔趣阁&#39;---》http://www.xbiquge.la所以搜不到我也没办法..........&#64;晓轩为了确保下载完整&#xff0c;每章设置了0.5秒到1秒延时&#xff01;") main()

源码后台私信小编 01



推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
author-avatar
我家在波力牧场
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有