前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫框架Scrapy 之(四) ---

爬虫框架Scrapy 之(四) ---

作者头像
py3study
发布2020-01-16 12:29:46
6460
发布2020-01-16 12:29:46
举报
文章被收录于专栏:python3python3

解析后返回可迭代对象

  • 这个对象返回以后就会被爬虫重新接收,然后进行迭代
  • 通过scrapy crawl budejie -o xx.josn/xx.xml/xx.csv 将迭代数据输出到json、xml或者csv格式的外部文件中
  • 如果管道开启,则每迭代一次数据就会将其输入到管道中(在settings文件中可以开启管道)

1. budejie.py 文件

 1  def parse(self, response):
 2         # 这个函数是解析函数,它是通过下载来回调,下载器下载完成一个url数据以后就会回调这个函数并且把下载的响应对象通过response参数传递过来
 3         print(response)

 4         # 解析response
 5         contents = response.xpath("//div[@class='j-r-list']/ul/li") # scrapy中自带xpath和css两种解析方法
 6         # print(contents)
 7         for content in contents:
 8             item = {}
 9             item["author"] = content.xpath(".//a[@class='u-user-name']/text()").extract()[0]
10             # scrapy的xpath和css方法中返回出来的是一个Selector对象列表,我们需要用extract函数将内容从这个对象中提取出来
11             item["authorImg"] = content.xpath(".//img[@class='u-logo lazy']/@data-original").extract()[0]
12             item["content"] = content.xpath(".//div[@class='j-r-list-c-desc']/a/text()").extract()[0]
13             item["imgSrc"] = content.xpath(".//img[@class='lazy']/@data-original").extract()[0]
14             # print(item)


15             yield item  # 每一个解析函数最后都要返回出去一个可迭代的对象
16             # 这个对象返回以后就会被爬虫重新接收,然后进行迭代
17             # 通过scrapy crawl budejie -o xx.josn/xx.xml/xx.csv 将迭代数据输出到json、xml或者csv格式的外部文件中
18             # 如果管道开启,则每迭代一次数据就会将其输入到管道中(在settings文件中可以开启管道)

开启管道,将迭代的对象传入管道

  • 在setting.py 文件中开启管道(67--69行)
1 ITEM_PIPELINES = {
2    'MyFirstScrapy.pipelines.MyfirstscrapyPipeline': 300,
3     # settings文件中可以配置相关的组件,其中ITEM_PIPELINES就是其中的一种组件(即管道组件),管道组件的值是一个字典,代表可以设置多个值
4     # 字典中的一个键值对就代表着一个管道组件,键代表当前管道组件的位置,值代表当前管道组件的优先级(数字越小优先级越大)
5 
6     # 数据会按照管道优先级,从高向低传递
7     'MyFirstScrapy.pipelines.CSVPipeline': 200
8 
9 }

MyfirstscrapyPipeline 管道类

  • 在pipelines.py 文件中 声明、设置管道类
 1 class MyfirstscrapyPipeline(object):
 2   # 这个类集成自一个普通类,但是如果我们把它加入到管道组件中就变成了一个管道类
 3 
 4     # 一个管道类有以下三个生命周期函数
 5     def open_spider(self,spider):
 6         print("爬虫开启")
 7         print("当前开启的爬虫为:",spider)
 8         # 创建一个redis链接
 9         self.rds = redis.StrictRedis(host="www.fanjianbo.com",port=6379,db=8)
10 
11     def process_item(self, item, spider):
12       # 当爬虫解析完数据以后,这个方法去迭代返回到管道中数据
13         print("爬虫正在迭代数据...")
14         print("当前正在%s爬虫迭代的数据是:%s"%(spider,item))
15         # 向redis数据库中存入数据
16         self.rds.lpush("budejie",item)
17         return item
18         # 每迭代一次以后,一定将迭代过的数据return出去
19 
20     def close_spider(self,spider):
21         print("爬虫%s关闭!"%spider)
22 
23 
24 
25 # 声明一个管道类,用于写csv数据
26 class CSVPipeline(object):
27     def open_spider(self,spider):
28         # 打开csv文件
29         self.csvfile = open("data.csv","a+",newline='',encoding="utf-8")
30         self.writer = csv.writer(self.csvfile)
31         self.writer.writerow(["author","authorImg","content","imgSrc"])
32 
33     def process_item(self,item,spider):
34         vals = []
35         for k,v in item.items():
36             vals.append(v)
37         self.writer.writerow(vals)
38         return item 
39         # 如果优先级高的管道跌打完数据以后不返回出去,
40         # 这个数据就会销毁,后面的管道就无法使用该数据
41 
42     def close_spider(self,spider):
43         self.csvfile.close()

 post请求

scrapy的下载器有Request和FormRequest两种,分别用来处理get请求和post请求

import scrapy

class FanyiSpider(scrapy.Spider):
    name = 'fanyi'
    allowed_domains = ['baidu.com']
    # start_urls = ['https://fanyi.baidu.com/sug']
    # scrapy中的下载器有两种:get请求的下载器 和 post请求的下载器
    #       (默认是发起get请求,引擎启动以后首先会从start_urls中提取起始地址,然后直接发起get请求)
    # 如果发起post请求首先要把start_urls注释掉
    # 重写生命周期函数
    def start_requests(self):
        # 这生命周期函数在下载启动之前调用
        print("下载器将要启动...")
        # post的url
        post_url = "https://fanyi.baidu.com/sug"
        # post参数
        data = {
            "kw":"a"
        }
        # 发起请求   scrapy的下载器有Request和FormRequest两种,分别用来处理get请求和post请求
        yield scrapy.FormRequest(url=post_url,formdata=data,callback=self.parse_post)
        

    # 定义一个函数,用于post请求的回调
    def parse_post(self, response):
        print(response.text)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解析后返回可迭代对象
  • 开启管道,将迭代的对象传入管道
  • MyfirstscrapyPipeline 管道类
  •  post请求
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档