scrapy环境安装和基本使用

 环境安装:
          Linux:

        pip install scrapy



      Windows:

          a. pip install wheel

          b. 下载twisted  http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

          c. 进入下载目录,执行 pip install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

                - twisted:帮助scrapy实现异步的一个工具。
                - 该步骤如果出错,可以尝试下载安装其他版本的twisted文件
          d. pip install pywin32

          e. pip install scrapy

 

- scrapy的基本使用
    - 创建一个工程:scrapy startproject ProName
        - spiders:爬虫文件夹。需要在内部创建一个爬虫文件
        - settings:配置文件
    - cd ProName
    - 创建爬虫文件:scrapy genspider spiderName www.xx.com
    - 执行工程:scrapy crawl spiderName

 

数据解析:

持久化存储

      --基于终端指令的持久化存储:

        --只可以将parse方法的返回值写入到本地文件,不可以存储到数据库

        --指令:scrapy crawl spiderName -o filePath

      --基于管道的持久化存储:

         --在爬虫文件中进行数据解析

         --将解析的数据存储封装到Item对象中

         --将Item类型的对象提交给管道

         --在管道文件中接受item对象,且对其内部存储的数据进行任何形式的持久化存储

         --在配置文件中开启管道机制

 

当多个管道类,分别存入本地和mysql还有redis的同时,管道里代码如下!  redis版本太高可能报错,建议降低版本

import pymysql
from redis import Redis

class QiubaiproPipeline:
fp = None
def open_spider(self,spider):
print('执行开始...')
self.fp = open('./qiubai.txt','w',encoding='utf-8')
def process_item(self, item, spider):
author = item['author']
content1 = item['content1']
self.fp.write(author+':'+content1)

return item#将这个item交给下一个即将执行的管道类
def close_spider(self,spider):
print('执行结束...')

class MysqlPipeline:
conn = None #创建连接对象
cursor = None
def open_spider(self,spider):
self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='root',db='spider',charset='utf8')
print(self.conn)
def process_item(self, item, spider):
author = item['author']
content1 = item['content1']
self.cursor = self.conn.cursor()
# sql = 'insert into qiushibaike values("{}","{}")'.format(author, content1)
sql = 'insert into qiushibaike values("%s","%s")'%(author, content1)
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
return item # 将这个item交给下一个即将执行的管道类

def close_spider(self,spider):
self.cursor.close()
self.conn.close()


class RedisPipeline:
conn = None
def open_spider(self,spider):
self.conn = Redis(host='127.0.0.1',port=6379)

def process_item(self, item, spider):
self.conn.lpush('qiushibaiData',item) #前者是先起的名字 然后把item往里放

 

下面是部分总结:

- 持久化存储
- 爬虫文件中进行数据解析
- 将解析的数据存储到item类型的对象
- 将item对象提交给管道
- 在管道中接收item,对其进行任意形式的持久化存储
- 在配置文件中开启管道

- 问题:什么时候需要用到多个管道类?
- 实现数据备份的时候。
- 如何将一组数据持久化存储到不同的载体中呢?
- 一个管道类表示将一组数据存储到一种形式的载体中。
- 如果有两个管道类的,爬虫文件提交的item会不会同时提交给这多个管道类?
- 爬虫文件提交的item只会提交给优先级最高的那一个管道类。
- 如何将item提交给其他的管道类?
无法实现。我们却可以将优先级最高的管道类接收到的item对象传递给其他的管道类。
在process_item方法中return item操作表示将item传递给下一个即将被执行的管道类
- 手动请求发送
- yield关键字在框架中只会被作用到两个地方
- 向管道提交item
- 手动发起请求
- yield scrapy.Reqeust(url,callback):发起的是get请求
- start_urls列表如何帮我们自动进行get请求发送
- 自动调用了一个start_reqeusts的方法,方法的模拟实现如下:
def start_requests(self):#模拟实现该方法的原始实现
print('i am start_requests()')
for url in self.start_urls:
yield scrapy.Request(url,callback=self.parse)
- 如何手动发起post请求:
- yield scrapy.FormRequest(url,formdata,callback)
- 如何让start_urls的列表元素发起post请求
- 重写start_reqeusts方法。
def start_requests(self):#模拟实现该方法的原始实现
print('i am start_requests()')
for url in self.start_urls:
yield scrapy.FormRequest(url,formdata,callback=self.parse)
- 请求传参
- 作用:可以帮助scrapy实现数据的深度爬取
- 深度爬取:爬取的数据没有存在于同一张页面
- 效果:可以让爬虫文件中多个解析的方法公用同一个item对象
- 传递item:yield scrapy.Request(url,callback,meta)
- 接受item:response.meta

- 五大核心组件
- 中间件的基本操作

posted @ 2020-07-09 13:41  一只小泡沫  阅读(91)  评论(0)    收藏  举报