朋友爬了本小说让我看看,评价一番,“操蛋,你从哪里学的?这就是一坨屎的爬虫·······” 至于我为什么发这么火,原因如下: 爬虫不注意细节,你谈什么爬虫! 这一期还是做一个干货,都是我半年以来的爬虫经验,需要教学可以私聊我,在校学生还是需要一点经济支持的! 写代码的时候大部分人是这样的 关于文件的写入, ‘w’ 的方式 是覆盖写, 没有就创建, 那么我们写小说就不需要用这个, 使用 一般我们都是从目录url 中, 去获取我们需要的章节网址, 这里拿我爬取的网址实例: 示例如下: 爬取小说这样的文字量很多的情况下, 文字的处理显得极为重要了,爬取小说不推荐使用正则re,也不推荐使用soup, 原因你获取不了网页自带的换行符和缩进符, 比如 xboo 之类的, 如果你获取不了文本自带的这些,那么你就得自己添加,可以使用re的sub进行适当的替换换行,这就很麻烦,这里一定推荐使用xpath的text() 去匹配, 方便快捷,爬小说的小助手! 示例如下: 非常的简单, 而且xpath的匹配非常的快,不会的朋友一定要学,soup真的不推荐,大工程起来真的慢! 他在爬小说的时候,也出现了这样的问题,在一个urls列表中, 竟然有的能请求成功, 有的不能请求成功, 明明都是网址没有错, 我也能打得开,但就是出现了这样的bug,很闹腾,但是后面我还是修复了。 bug 出现 : 所有的网址 一定是正确的, 我可以确保。 为什么会出现这样的情况,高频发的请求网址,如果不是使用框架, 那么就需要设置延迟时间了。比如sleep() 或者 request 加入参数 timeout ,不然很容易被网址通过请求次数 进而识别出来 这是一个爬虫程序, 也就是非人类操作, 那么他就可以不让你请求,从而你就爬虫失败! 这样搞: 将获取文本的函数 分离出来, 在parse_page 进行三次判断,失败就回溯,三次回溯,实测,请求被挡住的概率大幅降低。这是一个不错的方法, 当然, 还需要加入 sleep(), 来控制代码的延迟时间。 这一期干货就到此为此, 主要还是满足自己的需求,2020年了,看小说还不会爬虫,你有多捞!
看了一下朋友的代码,发现问题的所在之处,都是细节问题!
解决方案如下:
如何产生章节:
自己问自己,有多少人爬取小说是这样的,你自己能看吗?with open('**.text', 'w') as fw: fw.write(r.text)
‘a’ 追加写的模式, 然后添加适当的分隔符, 只有文本中添加目录, 整个txt在手机中才会显示出目录的存在 ,我的实例如下: 最好加点文字提示, 代表这章节下载成功到总txt中 !path = 'D://爬取小说//' os.chdir(path) # 进入这个文件夹 with open('酒神.txt', 'a+', encoding='utf-8') as fw: fw.write(''.join(items['title']) + 'nnn' + '- ' * 40) fw.write(''.join(items['text'])) print(f'{items["title"]} 下载完成!')
如何章节顺序稳定:
这里我们就能获取所有章节的网址了, 只要进行适当的拼接处理, 那么很多人就舒服了,直接获取整个url列表, 直接返回给调用函数, 舒服吧? 你电脑不舒服, 关于return 和 yield 你真的懂吗? 如果你请求的网址很多, 一定时间请求次数过多,就容易丢失网址,我想大部分人都是返回列表,然后遍历列表吧? 万一丢了一个章节网址呢? 是不是就会出现章节混乱的情况,使用yield 就不需要考虑这么多因素了, 它可以直接调用一次返回一次,有效的避免了可能的因素, 我觉得很好用, 我也推荐使用, 不是所有的返回都是用return!!!page_url = html.xpath('//div[@id="list"]/dl/dd/a/@href') for url in page_url[222:]: url = f'https://www.biquge.info/11_11079/{url}' yield url
如何保证文字的处理:
text = html.xpath('//div[@id="content"]/text()')
如何应对ip限制等因素:
多次请求,模块分离,你搞我, 我也可以搞你!
def parse_page_error(self, r): # 为处理异常: r.encoding = r.apparent_encoding html = etree.HTML(r.text) title = html.xpath('//div[@class="bookname"]/h1/text()') text = html.xpath('//div[@id="content"]/text()') items = {} items['title'] = title items['text'] = text self.save_text(items) def parse_page(self): """ 分析每一章节 然后下载, 次数过快 容易炸ip 三次保底请求 ! """ for url in self.get_page(): r = requests.get(url, headers=self.headers) time.sleep(0.7) if r.status_code == 200: self.parse_page_error(r) else: print(f'该 {url}未下载成功! 再次请求') rr = requests.get(url, headers=self.headers) if rr.status_code == 200: self.parse_page_error(rr) else: print("第三次请求!") rrr = requests.get(url, headers=self.headers) self.parse_page_error(rrr) print('全部下载完成!')
爬虫全程序:
# -*- coding : utf-8 -*- # @Time : 2020/6/2 16:13 # @author : 沙漏在下雨 # @Software : PyCharm # @ImapBox : https://me.csdn.net/qq_45906219 import requests from lxml import etree import os import time class Spider: def __init__(self): self.start_url = 'https://www.biquge.info/11_11079/' self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko)' ' Chrome/81.0.4044.129 Safari/537.36', 'Host': 'www.biquge.info', 'Referer': 'https://www.biquge.info/11_11079/5216668.html', 'Cookie': 'clickbids=11079; Hm_lvt_6dfe3c8f195b43b8e667a2a2e5936122=1591085546;' ' Hm_lvt_c979821d0eeb958aa7201d31a6991f34=1591085539,1591085553,1591085815; ' 'Hm_lpvt_6dfe3c8f195b43b8e667a2a2e5936122=1591087376; ' 'Hm_lpvt_c979821d0eeb958aa7201d31a6991f34=1591087377'} def get_page(self): """ 获得每一章节的网址 yield 回去 """ r = requests.get(self.start_url, headers=self.headers) if r.status_code == 200: r.encoding = r.apparent_encoding html = etree.HTML(r.text) page_url = html.xpath('//div[@id="list"]/dl/dd/a/@href') for url in page_url[222:]: url = f'https://www.biquge.info/11_11079/{url}' yield url def save_text(self, items): """ 根据章节下载' """ path = 'D://爬取小说//' os.chdir(path) # 进入这个文件夹 with open('酒神.txt', 'a+', encoding='utf-8') as fw: fw.write(''.join(items['title']) + 'nnn' + '- ' * 40) fw.write(''.join(items['text'])) print(f'{items["title"]} 下载完成!') def parse_page_error(self, r): # 为处理异常: r.encoding = r.apparent_encoding html = etree.HTML(r.text) title = html.xpath('//div[@class="bookname"]/h1/text()') text = html.xpath('//div[@id="content"]/text()') items = {} items['title'] = title items['text'] = text self.save_text(items) def parse_page(self): """ 分析每一章节 然后下载, 次数过快 容易炸ip 三次保底请求 ! """ for url in self.get_page(): r = requests.get(url, headers=self.headers) time.sleep(0.7) if r.status_code == 200: self.parse_page_error(r) else: print(f'该 {url}未下载成功! 再次请求') rr = requests.get(url, headers=self.headers) if rr.status_code == 200: self.parse_page_error(rr) else: print("第三次请求!") rrr = requests.get(url, headers=self.headers) self.parse_page_error(rrr) print('全部下载完成!') jiushen = Spider() jiushen.parse_page()
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算