1.Scrapy采集:
网络爬虫的挑战之一是你经常需要不断地重复一些简单任务:找出页面上的所有链接, 区分内链与外链,跳转到新的页面。
Scrapy 就是一个帮你大幅度降低网页链接查找和识别工作复杂度的 Python 库,它可以 让你轻松地采集一个或多个域名的信息。
a.articleSpider.py:
1 from scrapy.selector import Selector 2 from scrapy import Spider 3 from wikiSpider.wikiSpider.items import Article 4 5 class ArticleSpider(Spider): 6 """ 7 这个类的名称(ArticleSpider)与爬虫文件的名称(wikiSpider)是不同的, 8 这个类只是 在 wikiSpider 目录里的一员,仅仅用于维基词条页面的采集。 9 对一些信息类型较多的大网站,你可能会为每种信息(如博客的博文、图书出版发行信息、专栏文章等) 10 设置独立的 Scrapy 条目,每个条目都有不同的字段,但是所有条目都在同一个 Scrapy 项目里运行。 11 """ 12 name = "article" 13 allowed_domains = ["en.wikipedia.org"] 14 start_urls = ["http://en.wikipedia.org/wiki/Main_Page", 15 "http://en.wikipedia.org/wiki/Python_%28programming_language%29"] 16 17 def parse(self, response): 18 item = Article() 19 title = response.xpath('//h1/text()')[0].extract() 20 print("Title is : " + title) 21 item['item'] = title 22 return item
这个爬虫先进入 start_urls 里面的两个页面,收集信息,然后停止。虽然这个爬虫很简 单,但是如果你有许多 URL 需要采集,Scrapy 这种用法会非常适合。
为了更加的完善,定义一些规则让Scrapy在每个页面查找URL链接:
1 from scrapy.selector import Selector 2 from scrapy import Spider 3 from wikiSpider.wikiSpider.items import Article 4 from scrapy.contrib.spiders import CrawlSpider, Rule 5 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 6 7 class ArticleSpider(CrawlSpider): 8 """ 9 这个类的名称(ArticleSpider)与爬虫文件的名称(wikiSpider)是不同的, 10 这个类只是 在 wikiSpider 目录里的一员,仅仅用于维基词条页面的采集。 11 对一些信息类型较多的大网站,你可能会为每种信息(如博客的博文、图书出版发行信息、专栏文章等) 12 设置独立的 Scrapy 条目,每个条目都有不同的字段,但是所有条目都在同一个 Scrapy 项目里运行。 13 """ 14 name = "article" 15 allowed_domains = ["en.wikipedia.org"] 16 start_urls = ["http://en.wikipedia.org/wiki/Python_%28programming_language%29"] 17 rules = [Rule(SgmlLinkExtractor(allow=('(/wiki/)((?!:).)*$'),), 18 callable="parse_item", follow=True)] 19 20 def parse_item(self, response): 21 item = Article() 22 title = response.xpath('//h1/text()')[0].extract() 23 print("Title is : " + title) 24 item['title'] = title 25 return item
b. items.py:
1 # -*- coding: utf-8 -*- 2 3 # Define here the models for your scraped items 4 # 5 # See documentation in: 6 # https://doc.scrapy.org/en/latest/topics/items.html 7 8 import scrapy 9 from scrapy import Item,Field 10 11 #每个item(条目)对象表示网站上的一个页面 12 class WikispiderItem(scrapy.Item): 13 # define the fields for your item here like: 14 # name = scrapy.Field() 15 pass 16 17 class Article(Item): 18 #name = scrapy.Field() 19 title = Field()