使用scrapy构建爬虫
新建一个scrapy项目
scrapy startproject spider
scrapy会初始化一个项目,项目文件包括:
items.py
定制需要储存的文件的域,类似于ormpipelines.py
管道settings.py
设置相关参数spider
文件夹 定制爬虫
scrapy爬虫的组成
scarpy抓取一个页面的大致流程:
- 下载器下载HTTP响应内容
- 下载器传给执行回调函数进行解析
- 解析后调度器进行过滤,查重等等
- 将数据传给管道,作进一步处理
示例1
爬取www.xinli110.com上的文章标题
声明item
class XinliSpiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() content = scrapy.Field()
抓取并处理第一个页面
在此之前,首先在settings.py
中将pipeline相关语句取消注释
#coding:utf8 import sys import scrapy from scrapy.selector import Selector from scrapy_demo.items import XinliSpiderItem reload(sys) sys.setdefaultencoding('utf-8') class xinli_spider(scrapy.Spider): name = "xinli" allowed_domains = ["www.xinli110.com"]#允许抓取的域名 start_urls = ["http://www.xinli110.com"]#起始url def parse(self, response): #抓取网页后会默认调用parse函数进行处理 sel = Selector(response) #使用xpath选取html元素 title = sel.xpath("//title").extract() item = XinliSpiderItem() #由于sel.xpath().extract()返回的是一个list,所以先使用for遍历 item['title'] = [n for n in title]#将title中的内容赋值给item yield item#将item中的数据交由pipeline进一步处理
pipelines.py
:
#coding:utf8 import sys reload(sys) sys.setdefaultencoding('utf8') # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html class ScrapyDemoPipeline(object): def process_item(self, item, spider): #从item中读取数据并打印 print item['title'][0]
执行后会抓取并打印所有抓取到的网页标题
递归抓取整个网站
#coding:utf8 import sys import scrapy from scrapy.selector import Selector from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy_demo.items import XinliSpiderItem reload(sys) sys.setdefaultencoding('utf-8') class xinli_spider(CrawlSpider):#CrawlSpider类继承自Spider类,可以通过定义rules属性实现递归抓取 name = "xinli" allowed_domains = ["www.xinli110.com"]#允许抓取的域名 start_urls = ["http://www.xinli110.com"]#起始url #定义rules属性 rules = ( Rule(SgmlLinkExtractor(allow=(r'\/qsnxl\/(xlq\/xljb|xljb|zd|fd)\/\w+\/\d+\/\d+.html')),#使用正则表达式匹配符合要求的网页 callback='parse_item',#回调函数 follow=True#是否跟进此页上的url,如果callback为空的话则默认为true ), ) def parse_item(self, response): #抓取网页后会默认调用parse函数进行处理 sel = Selector(response) #使用xpath选取html元素 title = sel.xpath("//title").extract() item = XinliSpiderItem() #由于sel.xpath().extract()返回的是一个list,所以先使用for遍历 item['title'] = [n for n in title]#将title中的内容赋值给item yield item#将item中的数据交由pipeline进一步处理
示例2
爬取icarus.silversky.moe:666上特定分类的图片
代码
https://github.com/frankgx97/icarus-spider