您的位置:首页 > 编程语言 > Python开发

【Python爬虫】利用Python的requests库进行一次比较全面的数据爬取操作)二

2018-11-30 15:29 489 查看

【Python爬虫】利用Python的requests库进行一次比较全面的数据爬取操作)二

上篇文章我们已经对抓取某个url的html代码的方法进行了封装,下面我们就要用这个函数进行抓取工作了,首先还是要继续分析下网站通过主路由进入网站后我们可以发现我们先要继续深入的一些url地址,在进入每一个找到的url
直到定位到我们需要爬去的位置上在开始解析:

这些导航栏分别对应着不同的url的地址我们点击一个进入:

发现了许多小说介绍每个介绍后都有对应着自己的url 我们只需要进入到这些url的内容里就可以进行抓取了,下面来制定一下计划:
计划一:
1:通过主路由进入导航页面
2:对导航页面的html进行解析得到所有对应的url链接
3:遍历得到的url地址并逐个进入进行爬取
计划二:
1:通过主路由进入导航页面
2:对导航页面的html进行解析得到第一个url链接
3:进入得到的url地址进行爬取后再进入导航页面的第二个url进行爬取以此类推
这两种方案分别对应着两种优先模式:
1.广度优先
2.深度优先
关于这两种模式的介绍可参考:https://www.geek-share.com/detail/2704553540.html
方案制定好了我们下面采取广度优先的计划进行代码的编写
首先调用我们封装好的获取html的方法得到html,然后使用BeautifulSoup,re对页面进行解析得到我们想要的url信息,并保存下来,这里加入了进程池以提高效率,下面先上代码在介绍:

通过这个函数可以抓取到我们需要的url信息,返回值是一个列表,我们要把这个列表中的值存储到双向队列中以便使用,先来写一下main:

这样数据就被我们存在了队列中了,下面来写一个解析这些url的方法,我用的re:

参数q是进程池中的队列可在进程间通信使用,下面创建进程池来调用一下还是写在main中:

进程池不要采用异步的这里要使用同步的方法,被坑了一下一开始以为异步是指每个进程之间异步,现在想想好傻,每个进程之间可定是异步的要不然进程有啥用。。。不要忘记创建一下q = Manager().Queue()
这里每个进程启动时都会从待爬队列中取一个数出来,在进入方法所以不会存在并发的问题(个人认为不会)
在每个进程中通过q来保存爬取到的每本小说的url地址,q是可以在进程间通信的,所以每个进程都共享一个q
进程跑完我们要把我们保存好的q中的值拿出来存到待爬队列中去:

这里值得说的是如果q中不存在元素了继续get的话会造成阻塞所以我们要先判断是否为空在get(被坑了一下纳闷了好久),后来自己百度了一下资料这个q.qsize()和q.empty()在有多个进程对其做get操作时是不准确的,所以尽量不要在进程中一边get以便判断是否为空。今天有点忙先写到这吧,后续会继续晚上这个代码抓取小说信息并入库。

总结:

总结一下今天遇到的问题:由于对python进程池这块不太解(经常使用java的多线程,java的多线程和python的多进程区别还是挺大的)走了许多弯路下面罗列出来有的原理不是很懂希望会的大大受累解下惑:
1.是否使用了双向队列后就可以避免数据并发的问题?
2.一开始并没有使用进程池中的队列,而是直接把待爬队列传入了进程中,但是我发现进程跑完main方法中的待爬队列依然为空,这点很不理解,在进程中对参数做修改为什么在进程外没有改变,这是属于什么传递?或者怎么做就能让他修改完在进程外也有效果呢?这点没弄明白很头疼,要是明白的大大受累回复下谢谢

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: