爬虫之Scrapy框架 (2)

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 item

items.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存放请求参数,字典类型

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpzyg.html