产品需求:
1、 代码可以将笔趣阁完本小说分栏(共800多部)每本小说的简介和章节链接爬取下来,存入本地的csv文件或者mysql数据库;
2、 如果在csv文件翻看简介的时候,遇到感兴趣的小说时,可以实现代码快捷下载,将对应的小说一键下载到本地;
(ps:1的话,这个分栏可以爬,那么所有的分栏都可以爬了,只是这样对人家网站不太好,咱们也不需要那么多,看不完,所以只下载小说比较少的完本分栏;2的话,还是同样的道理,咱们只用下载比较想看的就可以了,不要贪多,对人家网站不太友好,损人不利己,要不得。)
技术难题:
额,没有…如果非要算的话,网页肯定对爬虫速度访问有所限制,这时候要用到:
1、 伪装请求头;
2、 爬取等待(就是爬一个停一下),但一个个爬,一个个等,太耗时间,决定使用多线程同时爬,各等各的,就可以把效率提上去了;
(ps:有小伙伴会说,python有GIL,所以不存在多线程,或者多线程性能提升不明显。但是这里主要是为了解决爬虫等待问题和IO密集型,不是针对科学计算,所以多线程的提升还是非常明显的,试过之后就明白啦。)
基本思路(代码结构吧):
爬虫框架肯定是首选Scrapy,但楼主用Scrapy不太多,前段时间因为不太明白Scrapy如何使用代理,所以搁置了,但是Scrapy的设计框架给了楼主很大启发,但这里只是个非常简单的爬虫,楼主就随性得写了,以后可以再回来优化框架和性能。
下载器使用requests包;
网页内容解析使用BeautifulSoup包;
准备工作:
1、先把基本的爬虫结构图画出来(使用表格吧):
一级文件夹二级文件夹说明
get_biqugeproxiespool存放IP代理池和调用代码proxiespool.py
useragentpool存放UserAgent代理池和调用代码useragentpool.py
小说主页存放爬取到的单个小说的主页地址到本地
小说简介存放爬取到的单个小说的简介到本地
小说章节存放爬取到的单个小说的所有章节和章节地址到本地
小说内容存放爬取到的单个小说的章节内容到本地
大致就是这么个结构,点开可查看
2、准备伪装的请求头代理池useragentpool
这里是使用楼主自己编写的useragentpool包,从本地txt文件中读取。
使用它的实例化方法ua_next(),可以实现UserAgent的循环使用;
使用它的实例化方法ua_random(),可以实现UserAgent的随机获取;
代码如下:
# coding:utf-8
# python 3.7
import random
import itertools as its
class ua(object):
# 楼主提前准备好的30多个UserAgent存在了同目录下的useragentpool.txt里,每行一个。
def __init__(self,dir=useragentpool/useragentpool.txt):
self.result_list = []
with open(dir,r,encoding=utf-8) as f:
for i in f.readlines():
i = i.strip(\n)
self.result_list.append(i)
*# 这里是将获取到的UA的列表转成迭代器,方便使用next()方法,要用到itertools包下的cycle方法,*生成一个无限循环的迭代器;
self.its = its.cycle(self.result_list)
def ua_random(self):
return random.choice(self.result_list)
def ua_next(self):
return next(self.its)
if __name__==__main__:
pass
————————————————
useragentpool.txt的内容格式大概就是这样的,点开查看
3、 准备代理池,用来提高爬取速度
这里是使用楼主自己编写的proxiespool包,从本地txt文件中读取代理IP和port。
ps:这里的txt文件中的内容,是UP主从代理网站上,付费获取的JSON格式
使用它的实例化方法ua_next(),可以实现UserAgent的循环使用;
使用它的实例化方法ua_random(),可以实现UserAgent的随机获取;
————————————————