赞
踩
让我们看看创建一个scrapy项目,一个爬虫文件之后,初始代码是什么意思。
name:爬虫文件的名称,是爬虫源文件的一个唯一标识。
每个爬虫文件名都不能一样。
allowed_domains:允许域名,用来限制start_urls列表哪些url可以进行请求发送。
当start_urls中有多个url,只有属于allowed_domains中域名的url才能进行请求发送。通常情况下是注释不使用的。
start_urls:起始url列表,该列表存放的url会被引擎发送给调度器。
可以同时放多个url。
parse:是用来数据解析的,其中response参数是下载器返回的响应对象。
再来看看settins.py中有什么。
BOT_NAME是项目名称。
SPIDER_MODULES是爬虫模块的位置。
ROBOTSTXT_OBEY是否遵循robots协议。
除了这些,其他都是注释的要配置什么设置就要手动打开,此外还可以自己加上
USER_AGENT = 'xxx' 用来设置请求头,模拟浏览器。
LOG_LEVEL = "ERROR" 用来设置日志等级。 默认debug级别。
我们主要的代码还是在spider中的parse里写,一般都是习惯于xpath来数据解析。
我们知道用xpath返回的是一个列表,但是列表元素是selector类型的元素。
tag = li.xpath('./div[2]/a/text()')>> [<Selector xpath='./div[2]/a/text()' data='这个笑话好内涵,你懂了没?'>]
我们怎样才能只拿到文本内容呢?就要用到extract(),extract可以将selector对象中data参数存储的字符串提取出来。
tag = li.xpath('./div[2]/a/text()').extract()>> ['这个笑话好内涵,你懂了没?']
如果返回列表中只有一个值的话,我们可以用extract_first(),extract_first是能将列表中第0个元素进行extract操作,返回的是字符串就不是列表了。
tag = li.xpath('./div[2]/a/text()').extract_first()>> 这个笑话好内涵,你懂了没?
那要是列表有多个值的话,就只能用extract,不过我们可以用join来吧多个字符串连在一起。
content = li.xpath('./div[1]/text()').extract() content = ''.join(content)>> 有位非常漂亮的女同事,有天起晚了没有时间化妆便急忙冲到公司。结果那天她被记旷工了……吃惊
接下来看看怎么存储内容。
scrapy中有两种存储方式:一个是基于终端指令,一个是基于管道。
可以将parse中数据解析出来的数据存储到本地的文本文件中。
def parse(self, response): li_list = response.xpath('//*[@id="list"]/ul/li') all_data = [] for li in li_list: tag = li.xpath('./div[2]/a/text()').extract_first() content = li.xpath('./div[1]/text()').extract_first() dic = { 'tag':tag, 'content':content } all_data.append(dic) return all_data
输入命令 scrapy crawl spidername -o filepath.csv
在项目路径下会出现一个csv格式的文件 ,里面就是我们解析的内容。
注意:只能存储json,jsonlines,jl,csv,xml,marshal,pickle这几种类型的文本文件。
指令 scrapy crawl spidername -o filepath.csv 。
这种方法的好处是便捷高效,但是局限性很大,除了上述几种类型的文本文件,其他都不能,也不能存储到数据库中。
首先在item中定义相关的属性。例如我想要存储tag和content。
class QiubaiproItem(scrapy.Item): # define the fields for your item here like: tag = scrapy.Field() content = scrapy.Field()
然后再spider中导入item类 from项目名.items import item中的类名。
from qiubaipro.items import QiubaiproItem
再实例化一个item类型的对象,将要存储的内容封装到item对象中。
item = QiubaiproItem() item['tag'] = tag item['content'] = content
最后提交给管道进行持久化存储的操作。
yield item #将item提交给pipelines
在管道(pipelines)中有个一个类,类里面还有一个方法,它是专门用来处理爬虫文件提交过来item对象的,每接受到一个item就会被调用一次。
class QiubaiproPipeline: def process_item(self, item, spider): return item
接下就是把item中的内容进行存储,不过我们要写一个方法用来打开或者新建一个txt文本,一个方法用来关闭。
- class QiubaiproPipeline:
- fp = None
- #重写父类的一个方法:该方法只在开始爬虫的时候被调用一次
- def open_spider(self,spider):
- print('开始爬虫...')
- self.fp = open('./qiubai.txt','w',encoding='utf-8')
-
- #该方法每接受一个item就会被调用一次
- def process_item(self, item, spider):
- tag = item['tag']
- content = item['content']
- self.fp.write(tag+':'+content+'\n')
- self.fp.write('\n')
- return item
-
- def close_spider(self,spider):
- print('结束爬虫!')
- self.fp.close()

还有不要忘记了在配置文件中打开管道,把ITEM_PIPELINES的注释去掉,其中300表示优先级,越小优先级越高。
scrapy中常用的一些方法和内容大概就是这些,当然还有很多的也还没介绍完,如果大家感兴趣可以去看看文档。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。