零基础写python爬虫之使用Scrapy框架编写爬虫
网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据。虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间。Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便。使用Scrapy可以很方便的完成网上数据的采集工作,它为我们完成了大量的工作,而不需要自己费大力气去开发。 首先先要回答一个问题。 好的,基本流程既然确定了,那接下来就一步一步的完成就可以了。 1.新建项目(Project) 复制代码 代码如下: scrapy startproject tutorial 其中,tutorial为项目名称。 复制代码 代码如下: tutorial/ scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py ... 下面来简单介绍一下各个文件的作用: 2.明确目标(Item) 修改tutorial目录下的items.py文件,在原本的class后面添加我们自己的class。 复制代码 代码如下: # Define here the models for your scraped items # # See documentation in: # http://doc.scrapy.org/en/latest/topics/items.html from scrapy.item import Item,Field class TutorialItem(Item): # define the fields for your item here like: # name = Field() pass class DmozItem(Item): title = Field() link = Field() desc = Field() 刚开始看起来可能会有些看不懂,但是定义这些item能让你用其他组件的时候知道你的 items到底是什么。 3.制作爬虫(Spider) 制作爬虫,总体分两步:先爬再取。 下面我们来写第一只爬虫,命名为dmoz_spider.py,保存在tutorialspiders目录下。 复制代码 代码如下: from scrapy.spider import Spider class DmozSpider(Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self,response): filename = response.url.split("/")[-2] open(filename,'wb').write(response.body) allow_domains是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页。 复制代码 代码如下: scrapy crawl dmoz 运行结果如图: 报错了: 复制代码 代码如下: import sys sys.setdefaultencoding('gb2312') 再次运行,OK,问题解决了,看一下结果: 最后一句INFO: Closing spider (finished)表明爬虫已经成功运行并且自行关闭了。 那么在刚刚的电闪雷鸣之中到底发生了什么呢? 3.2取 这是一些XPath表达式的例子和他们的含义 为了方便使用XPaths,Scrapy提供XPathSelector 类,有两种可以选择,HtmlXPathSelector(HTML数据解析)和XmlXPathSelector(XML数据解析)。 3.3xpath实验 熟悉完了实验的小白鼠,接下来就是用Shell爬取网页了。 复制代码 代码如下: scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/ 回车后可以看到如下的内容: 在Shell载入后,你将获得response回应,存储在本地变量 response中。 或者输入response.headers 来查看它的 header部分: 现在就像是一大堆沙子握在手里,里面藏着我们想要的金子,所以下一步,就是用筛子摇两下,把杂质出去,选出关键的内容。 可以输入: 复制代码 代码如下: sel.xpath('//title') 结果就是: 这样就能把这个标签取出来了,用extract()和text()还可以进一步做处理。 复制代码 代码如下: In [1]: sel.xpath('//title') Out[1]: [<Selector xpath='//title' data=u'<title>Open Directory - Computers: Progr'>] In [2]: sel.xpath('//title').extract() Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>'] In [3]: sel.xpath('//title/text()') Out[3]: [<Selector xpath='//title/text()' data=u'Open Directory - Computers: Programming:'>] In [4]: sel.xpath('//title/text()').extract() Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books'] In [5]: sel.xpath('//title/text()').re('(w+):') Out[5]: [u'Computers',u'Programming',u'Languages',u'Python'] 当然title这个标签对我们来说没有太多的价值,下面我们就来真正抓取一些有意义的东西。 我们可以用如下代码来抓取这个<li>标签: 复制代码 代码如下: sel.xpath('//ul/li') 从<li>标签中,可以这样获取网站的描述: 复制代码 代码如下: sel.xpath('//ul/li/text()').extract() 可以这样获取网站的标题: 复制代码 代码如下: sel.xpath('//ul/li/a/text()').extract() 可以这样获取网站的超链接: 复制代码 代码如下: sel.xpath('//ul/li/a/@href').extract() 当然,前面的这些例子是直接获取属性的方法。 3.4xpath实战 复制代码 代码如下: from scrapy.spider import Spider from scrapy.selector import Selector class DmozSpider(Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",response): sel = Selector(response) sites = sel.xpath('//ul/li') for site in sites: title = site.xpath('a/text()').extract() link = site.xpath('a/@href').extract() desc = site.xpath('text()').extract() print title 注意,我们从scrapy.selector中导入了Selector类,并且实例化了一个新的Selector对象。这样我们就可以像Shell中一样操作xpath了。 复制代码 代码如下: scrapy crawl dmoz 运行结果如下: 果然,成功的抓到了所有的标题。但是好像不太对啊,怎么Top,Python这种导航栏也抓取出来了呢? 看来是我们的xpath语句有点问题,没有仅仅把我们需要的项目名称抓取出来,也抓了一些无辜的但是xpath语法相同的元素。 复制代码 代码如下: from scrapy.spider import Spider from scrapy.selector import Selector class DmozSpider(Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",response): sel = Selector(response) sites = sel.xpath('//ul[@class="directory-url"]/li') for site in sites: title = site.xpath('a/text()').extract() link = site.xpath('a/@href').extract() desc = site.xpath('text()').extract() print title 成功抓出了所有的标题,绝对没有滥杀无辜: 3.5使用Item 复制代码 代码如下: >>> item = DmozItem() >>> item['title'] = 'Example title' >>> item['title'] 'Example title' 作为一只爬虫,Spiders希望能将其抓取的数据存放到Item对象中。为了返回我们抓取数据,spider的最终代码应当是这样: 复制代码 代码如下: from scrapy.spider import Spider from scrapy.selector import Selector from tutorial.items import DmozItem class DmozSpider(Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",response): sel = Selector(response) sites = sel.xpath('//ul[@class="directory-url"]/li') items = [] for site in sites: item = DmozItem() item['title'] = site.xpath('a/text()').extract() item['link'] = site.xpath('a/@href').extract() item['desc'] = site.xpath('text()').extract() items.append(item) return items 4.存储内容(Pipeline) 复制代码 代码如下: scrapy crawl dmoz -o items.json -t json -o 后面是导出文件名,-t 后面是导出类型。 因为这个只是一个小型的例子,所以这样简单的处理就可以了。 以上便是python爬虫框架Scrapy制作爬虫抓取网站内容的全部过程了,非常的详尽吧,希望能够对大家有所帮助,有需要的话也可以和我联系,一起进步 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |