spiderName .py
# -*- coding: utf-8 -*- import scrapy from duanziPro.items import DuanziproItem class DuanziSpider(scrapy.Spider): name = \'duanzi\' # allowed_domains = [\'www.xx.com\'] start_urls = [\'https://duanziwang.com/\'] # 基于管道的持久化存储 def parse(self, response): article_list = response.xpath(\'/html/body/section/div/div/main/article\') # 基于xpath表达式解析 for article in article_list: title = article.xpath(\'./div[1]/h1/a/text()\').extract_first() content = article.xpath(\'./div[2]/pre/code//text()\').extract() content = \'\'.join(content) print(content) # 实例化item对象 item = DuanziproItem() # 通过中括号的形式访问属性给其赋值 item[\'title\'] = title item[\'content\'] = content # 向管道提交item yield itemitems.py
import scrapy class DuanziproItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 使用固有属性定义了两个属性 # Field是一个万能数据类型 title = scrapy.Field() content = scrapy.Field()pipelines.py
class DuanziproPipeline(object): # 重写父类的该方法:该方法只会在爬虫开始的时候执行一次 fp = None # 打开文件 def open_spider(self, spider): print(\'open spider\') self.fp = open(\'./duanzi.txt\', \'w\', encoding=\'utf-8\') # 关闭文件 def close_spider(self, spider): print(\'close spider\') self.fp.close() # 接收爬虫文件返回item对象,process_item方法每调用一次可接收一个item对象 # item参数:接收到的某一个item对象 def process_item(self, item, spider): # 取值 title = item[\'title\'] content = item[\'content\'] self.fp.write(title + ":" + content + "\n") return item 管道存储细节处理
管道文件中的管道类表示的是什么?
一个管道类对应的就是一种存储形式(文本文件,数据库)
如果想要实现数据备份,则需要使用多个管道类(多种存储形式:MySQL,Redis)
process_item中的 retutn item:
将item传递给下一个即将被执行(按照配置文件中ITEM_PIPELINES得权重排序)的管道类
存储到MySQL在pipelines.py中添加如下代码
import pymysql class MysqlPipeline(object): conn = None cursor = None def open_spider(self, spider): self.conn = pymysql.Connect(host=\'127.0.0.1\', port=3306, user=\'root\', password=\'123\', db=\'spider\', charset=\'utf8\') def process_item(self, item, spider): # 取值 title = item[\'title\'] content = item[\'content\'] self.cursor = self.conn.cursor() # sql语句 sql = \'insert into duanzi values ("%s","%s")\' % (title, content) try: self.cursor.execute(sql) self.conn.commit() except Exception as e: print(e) self.conn.rollback() return item def close_spider(self, spider): self.cursor.close() self.conn.close()在settings.py中将MysqlPipeline类注册到ITEM_PIPELINES中
ITEM_PIPELINES = { # 300表示的是优先级,数值越小,优先级越高 \'duanziPro.pipelines.DuanziproPipeline\': 300, \'duanziPro.pipelines.MysqlPipeline\': 301, } 存储到Redis
因为redis有的版本不支持存储字典,下载2.10.6版本
pip install redis==2.10.6
在pipelines.py中添加如下代码
from redis import Redis class RedisPipeline(object): conn = None def open_spider(self, spider): self.conn = Redis(host=\'127.0.0.1\', port=6379, password=\'yourpassword\') def process_item(self, item, spider): self.conn.lpush(\'duanziList\', item) # 报错:因为redis有的版本不支持存储字典,pip install redis==2.10.6在settings.py中将RedisPipeline类注册到ITEM_PIPELINES中
ITEM_PIPELINES = { # 300表示的是优先级,数值越小,优先级越高 \'duanziPro.pipelines.DuanziproPipeline\': 300, \'duanziPro.pipelines.RedisPipeline\': 301, } 手动发送请求
可以在start_urls这个列表中添加url,但是比较繁琐
get请求发送
yield scrapy.Request(url,callback)
url:指定好请求的url
callback:callback指定的回调函数一定会被执行(数据解析)
post请求发送
yield scrapy.FormRequest(url,callback,formdata)
formdata存放请求参数,字典类型