使用直接调用文件入口作为程序的起点

使用直接调用文件入口作为程序的起点

if__name__ =="__main__": 

     main()

注意,这一句并不代表如果该if之前有其他直接暴露出来的代码时,他会首先执行。

该if语句只是代表顺序执行到这句话时进行判断调用者是谁,若是直接运行的该文件,则进入结构,若是其他文件调用,那就跳过。

多线程

仔细想想就可以发现,其实爬10页(每页25本),这10页爬的先后关系是无所谓的,因为写入的时候没有依赖关系,各写各的,所以用串行方式爬取是吃亏的。显然可以用并发来加快速度,而且由于没有同步互斥关系,所以连锁都不用上。

正如引用博文所说,由于问题的特殊性,我用了与之相似的较为直接的直接分配给各个线程不同的任务,而避免了线程交互导致的其他问题。

我的代码中多线程的核心代码不多,见下。

扫描二维码关注公众号,回复: 6203212 查看本文章

调用线程库threading,向threading.Thread()类中传入要用线程运行的函数及其参数。

线程列表依次添加对应不同参数的线程,pagelist[i],step两个参数是关键,我是分别为每个线程分配了不同的页面链接,这个地方我想了半天,最终使用了一些数学计算来处理了一下。

同时也简单试用了下列表生成式:

pagelist = [x for x in range(0, pagenum, step)]

这个和下面是一致的:

threading.Thread的几个方法

值得参考:多线程

start() 启动线程

jion([timeout]),依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的join函数。在程序中,最后join()方法使得当所调用线程都执行完毕后,主线程才会执行下面的代码。相当于实现了一个结束上的同步。这样避免了前面的线程结束任务时,导致文件关闭。

注意

使用多线程时,期间的延时时间应该设置的大些,不然会被网站拒绝访问,这时你还得去豆瓣认证下"我真的不是机器人"(尴尬)。我设置了10s,倒是没问题,再小些,就会出错了。

完整代码

效率有提升

对应的单线程程序在github上。单线程:

可见时间超过30分钟。修改后时间缩短到了11分钟。

文件截图

猜你喜欢

转载自blog.csdn.net/fei347795790/article/details/90065363