python——爬虫&问题解决&思考(三)
继续上一篇文章的内容,上一篇文章中,将爬虫调度器已经写好了,调度器是整个爬虫程序的“大脑”,也可以称之为指挥中心。而现在,我们要做的就是去将调度器中用到的其他组件写好。首先是url管理器,它既然作为管理器,那么它一定要区分待爬取的url和已经爬取的url,否则会重复爬取。这里教程用的是set集合,将两个url暂时存放到集合中,也就是内存中,毕竟比较爬取的数据比较少,当然也可以存放到别的地方,比如缓存或者关系型数据库中。
从图中可以看出,一共出现5次:
第一次是调度器初始化函数中,创建这个urlmanager对象,
第二次是调用了add_new_url方法来将最初始的url加入到带爬取的集合中,
第三次是在爬取过程中来判断是否有待爬取的url,
第四次是将要爬取的url从集合中取出来,
第五次是将页面解析出来的新的一组url再次添加到带爬去集合中
那么我们接下来就要做的是用代码来实现这些功能:
class UrlManager(object): """docstring for UrlManager""" def __init__(self): self.new_urls = set() self.old_urls = set() #向管理器中添加一个新的url def add_new_url(self,url): if url is None: return if url not in self.new_urls and url not in self.old_urls: self.new_urls.add(url) #从爬取数据中向管理器中批量添加url def add_new_urls(self,urls): if urls is None or len(urls) == 0: return for url in urls: self.add_new_url(url) #判断是否有新的url def has_new_url(self): return (len(self.new_urls) != 0) #从管理器中取出一个新的url def get_new_url(self): new_url = self.new_urls.pop() self.old_urls.add(new_url) return new_url
好,到这,url管理器就搞定了!
接下来就是url下载器了,很简单一个功能,将程序访问的页面保存下来。
从上图可以看出,下载器只在调度器中出现过两次:
第一次是初始化的时候创建
第二次是紧接着取到url之后,马上调用它来下载页面
在url下载器中,原教程使用的是urllib库,我觉得有点繁琐。所以我换成了一个更好用的库:requests。这个库可以帮助我屏蔽许多技术难题,直接去抓取我们想要访问的页面,而且使用起来非常简单。
import requests class HtmlDownloader(object): """docstring for HtmlDownloader""" def download(self,url): if url is None: return response = requests.get(url, timeout = 0.1) response.encoding = 'utf-8' if response.status_code == requests.codes.ok: return response.text else: return
简要讲一下这段代码:
a.首先要导入requests库,这个因为是第三方库,所以需要你自己下载 ,在命令行 输入 :pip install requests
b.然后开始写下载器这个类,这个类只有一个方法,就是download。这个方法首先会接受你给定的url,然后对其进行判断是否存在。
c.然后调用requests的get方法,它里面接受两个参数,一个是url,还有一个是timeout
timeout是我自己额外加进去的,就是访问超时。如果不加timeout,程序会假死,也就是说会一直在那里等待页面的响应,也不抛出异常。
d.然后对返回的response进行编码设置,因为爬取的百度百科页面是utf-8,所以这里最好还是设置一下,虽然requests会智能判断,但是还是手动改一下为宜。
e.然后在判断页面是否响应,这里的codes.ok其实就是200,表示网页正常响应,你这里直接写 response.status_code == 200 也没问题。
f.最后,将页面的所有内容都返回,这里的text就是一个字符串,它包含了一个页面的所有代码(html,css,js)。
python——爬虫&问题解决&思考(三)的更多相关文章
- python——爬虫&问题解决&思考(1)
最近刚接触python,找点小任务来练练手,希望自己在实践中不断的锻炼自己解决问题的能力.这个小爬虫来自慕课网的一门课程,我在这里记录的是自己学习的过程中遇到的问题和解决方法以及爬虫之外的思考. 这次 ...
- python——爬虫&问题解决&思考(四)
继续上一篇文章的内容,上一篇文章中已经将url管理器和下载器写好了.接下来就是url解析器,总的来说这个模块是几个模块中比较难的.因为通过下载器下载完页面之后,我们虽然得到了页面,但是这并不是我们想要 ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
- 路飞学城-Python爬虫集训-第三章
这个爬虫集训课第三章的作业讲得是Scrapy 课程主要是使用Scrapy + Redis实现分布式爬虫 惯例贴一下作业: Python爬虫可以使用Requests库来进行简单爬虫的编写,但是Reque ...
- Python爬虫学习笔记(三)
Cookies: 以抓取https://www.yaozh.com/为例 Test1(不使用cookies): 代码: import urllib.request # 1.添加URL url = &q ...
- Python 爬虫入门(三)—— 寻找合适的爬取策略
写爬虫之前,首先要明确爬取的数据.然后,思考从哪些地方可以获取这些数据.下面以一个实际案例来说明,怎么寻找一个好的爬虫策略.(代码仅供学习交流,切勿用作商业或其他有害行为) 1).方式一:直接爬取网站 ...
- python爬虫入门(三)XPATH和BeautifulSoup4
XML和XPATH 用正则处理HTML文档很麻烦,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素. XML 指可扩展标记语言(EXtensible Ma ...
- Python爬虫实例(三)代理的使用
一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问.所以我们需要设置一些代理服务器,每隔一段时间换一 ...
- Python爬虫基础(三)urllib2库的高级使用
Handler处理器 和 自定义Opener opener是 urllib2.OpenerDirector 的实例,其中urlopen是模块默认构建的opener. 但是基本的urlopen()方法不 ...
随机推荐
- 1034. Head of a Gang
One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...
- node.js系列(模块):request模块实现与php的通讯
app.js: var express = require('express'); var request = require('request'); var app = express(); /*r ...
- FOJ 11月月赛题解
抽空在vjudge上做了这套题.剩下FZU 2208数论题不会. FZU 2205 这是个想法题,每次可以在上一次基础上加上边数/2的新边. #include <iostream> #in ...
- linux下删除乱码文件、目录
由于编码原因,在linux服务器上上传.创建中文文件或目录时,会产生乱码,如果想删除它,发现用rm命令是删除不了的 这种情况下,用find命令可以删除乱码的文件或目录. 首先进入乱码文件或目录所在的目 ...
- C语言学习的第一章
首先,学习编写程序要先知道什么是程序,我们为什么要写程序? 程序就是为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合.程序里有很多算法,算法是解决问题的具体方法和步骤,就像我们想要得 ...
- Python-3------新年考试周的Python学习
2016一开始就是考试周,准备专业课的考试复习.每天上午复习,晚上复习到8点半,之后到10点这点时间来看Python.庆幸没有在忙碌的时候荒废 Python的学习. 期待寒假,以前寒假在家总是没事做, ...
- wcf发布的服务在前端调用时,遇到跨域问题的解决方案
我是使用IIS作为服务的宿主,因此需要在web.config中增加如下配置节: <bindings> <webHttpBinding> <binding name=&qu ...
- SSM框架搭建——我的第一个SSM项目
转载自:http://blog.csdn.net/tmaskboy/article/details/51464791 作者使用MyEclipse 2014版本 本博客所编写程序源码为: http:// ...
- PHP:基于百度大脑api实现OCR文字识别
有个项目要用到文字识别,网上找了很多资料,效果不是很好,偶然的机会,接触到百度大脑.百度大脑提供了很多解决方案,其中一个就是文字识别,百度提供了三种文字识别,分别是银行卡识别.身份证识别和通用文字识别 ...
- IOS的UITableView
UITableView 概述 UITableView 一般用来展示表格数据.可以滚动(继承自UIScrollView).性能极佳 UITableView分两种样式: Plain,不分组的样式 Grou ...