Python实例(爬虫第一期)Python3.7多线程爬取笔趣阁

产品需求:

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的随机获取;

————————————————