scrapy爬虫项目的结构
items.py: 用来存放爬虫爬取下来的数据的模型。有固定的格式。
middlewares.py: 用于存放各种中间的文件。
pipelines.py: 用于将items的模型存储到本地磁盘中。
settings.py: 本爬虫的一些配置信息。例如,浏览器的请求头,多久发送一次请求,ip代理等。
scrapy.cfg: 项目的配置文件。
spider包: 以后所有的爬虫,都是存放在这个里面。
每个文件结构里面的一些注意事项
1. item.py
建议在items.py中定义好模型,以后就不用使用字典定义了。其中模型定义的写法是固定的,例如:
class PriscillaItem(scrapy.Item):
Author=scrapy.Field()
Content=scrapy.Field()
定义好模型后,在spider文件中,首先要引用该模型,写入例如:
from Priscilla.items import PriscillaItem
随后把抓取的内容,返回对应的模型类型,并用yield返回到pipelines.py中。写法例子如下:
item=PriscillaItem(Author=author,Content=content)
yield item
2. pipeline.py
这是专门用来保存数据的,其中有三个常用方法需要定义:
open_spider(self,spider): 当爬虫被打开时候执行。
process_item(self,item,spider): 当爬虫有item传过来时候被调用 。
close_spider(self,spider): 当爬虫关闭时候被调用。
注意,需要激活pipeline才能正常使用,在'settings.py'中,设置‘ITEM_PIPELINES".
ITEM_PIPELINES = {'Priscilla.pipelines.PriscillaPipeline': 300,}
下面代码是pipeline.py中的例子:
import json
class PriscillaPipeline(object):
def __init__(self):
self.fp=open("duanzi.json",'w',encoding='utf-8')
def open_spider(self,spider):
print("爬虫开始")
def process_item(self, item, spider):
item_json=json.dumps(dict(item),ensure_ascii=False)
self.fp.write(item_json+'\n')
return item
def close_spider(self, spider):
self.fp.close()
print("爬虫结束了")
3. 爬虫代码中的注意点
response是一个'scrapy.http.response.html.HtmlResponse"对象,可以执行'xpath'和’css'提取数据。
提取出来的数据,是一个‘Selector’或者是一个'SelectorList'对象。
如果想要获取其中的字符串,那么应该执行'getall'或者‘get'方法。这里getall等效于extract(),get等效于extract_first()。
getall方法: 获取Selector中的所有文本。返回一个列表。
get方法: 获取的是Selector中的第一个文本。返回一个str类。
如果数据解释回来,要传给pipline处理,可以使用yield来返回数据。或者把所有的item收集起来,作为一个大的列表,统一用return 返回大列表。