python—scrapy数据解析、存储

基本操作:python-scrapy爬虫框架基本使用_郑*杰的博客-CSDN博客

数据解析

当前文件 :D:\python_test\scrapyProject\scrapyProject\spiders\first.py

import scrapy
class FirstSpider(scrapy.Spider):
    name = 'first'
    start_urls = ['https://ishuo.cn/duanzi'] 
    
    def parse(self, response):
        # 直接调用xpath方法对响应数据进行xpath形式的数据解析
        list_li = response.xpath('//*[@id="list"]/ul/li')
        for li in list_li:
            # title = li.xpath('./div[2]/a/text()')[0]
            # print(title) 打印是selector的对象,且数据存在于该对象的data参数里,
            # <Selector xpath='./div[2]/a/text()' data='一年奔波,尘缘遇了谁'>
            # 解析方案1:
            title = li.xpath('./div[2]/a/text()')[0]
            # extract()可以将selector对象中data参数的值取出
            print(title.extract())


            # 解析方案2:
            # title是一个Selector对象的列表,我们只要第一个列表元素
            title = li.xpath('./div[2]/a/text()')
            # extract_first()可以将列表中第0个列表元素表示的selector对象中data的参数值取出
            print(title.extract_first())
            break

termail目录下(<D:\python_test\scrapyProject>)执行:scrapy crawl first

返回结果:
一年奔波,尘缘遇了谁
一年奔波,尘缘遇了谁

数据存储—基于终端指令

- 只可以将数据存储到文本文件无法写入数据库
- 存储数据文件后缀是指定好的,通常使用.csv
- 需要将存储的数据封装到parse方法的返回值中

当前文件:D:\python_test\scrapyProject\scrapyProject\spiders\first.py

import scrapy

class FirstSpider(scrapy.Spider):
    name = 'first'
    start_urls = ['https://ishuo.cn/duanzi']

    def parse(self, response):
        list_li = response.xpath('//*[@id="list"]/ul/li')
        data_list=[]
        for li in list_li:
            title = li.xpath('./div[2]/a/text()').extract_first()
            dic ={
                'title':title
            }
            data_list.append(dic)
        return data_list

termail目录下(<D:\python_test\scrapyProject>)执行:scrapy crawl first -o data.csv

结果:
生成一个data.csv,保存了data_list数据

数据存储—基于管道(推荐)

步骤从爬虫文件first.py开始看:

# 当前文件:D:\python_test\scrapyProject\scrapyProject\spiders\first.py
import scrapy
from ..items import ScrapyprojectItem

class FirstSpider(scrapy.Spider):
    name = 'first'
    start_urls = ['https://ishuo.cn/duanzi']

    def parse(self, response):
        #  第一步,数据解析
        list_li = response.xpath('//*[@id="list"]/ul/li')
        for li in list_li:
            title = li.xpath('./div[2]/a/text()').extract_first()
            content = li.xpath('./div[1]/text()').extract_first()

            # 第二步,在items.py创建字段接受我们所需要的变量后导入,请打开items.py,然后将变量放到该items对象
            items = ScrapyprojectItem()
            items['item_title'] = title
            items['item_content'] =  content

            # 第三步,将item对象传给管道(pipelines.py)
            yield  items

            # 第四步,管道接受items对象,请打开pipelines.py
            # 第五步,在管道文件pipelines.py重写父类的文件方法,写入数据,请打开pipelines.py
            # 第六步,在setting.py设置管道机制打开,setting.py以下注释放开即可
            ''' 
                ITEM_PIPELINES = {'scrapyProject.pipelines.ScrapyprojectPipeline': 300,}
            '''
            # termail目录下(<D:\python_test\scrapyProject>)执行:scrapy crawl first

 items.py文件内容如下

当前文件:D:\python_test\scrapyProject\scrapyProject\items.py

import scrapy

class ScrapyprojectItem(scrapy.Item):
    # 第二步:创建字段接受我们所需要的变量
    item_title = scrapy.Field()
    item_content = scrapy.Field()

 pipelines.py文件内容如下

当前文件:D:\python_test\scrapyProject\scrapyProject\pipelines.py
有时为了例于记忆要改类名时,需要同步把setting.py的配置(ScrapyprojectPipeline)改成相同
ITEM_PIPELINES = {'scrapyProject.pipelines.ScrapyprojectPipeline': 300,}

class ScrapyprojectPipeline:

    def open_spider(self, spider):
        print('打开文件方法,项目运行开始时只会被执行一次!')
        self.fp = open('items.txt', 'w', encoding='utf-8')

    # process_item方法调用的次数等于爬虫文件提交item的次数
    def process_item(self, item, spider):
        # 请看first.py步骤描述,这里是第四步:接受item提交到这里的数据(字典形式)
        title = item['item_title']
        content = item['item_content']
        self.fp.write(f'{title}:{content}\n')
        return item

    def close_spider(self, spider):
        print('关闭文件方法,项目运行结束时只会被执行一次!')
        self.fp.close()

setting.py文件

增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。

降低日志级别: 在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为WORNING或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘ERROR’

禁止cookie:如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False

禁止重试: 对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False

减少下载超时:如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s

 发送post请求

当前文件:D:\python_test\scrapyProject\loadImg\loadImg\spiders\first.py


import scrapy
class FanyiSpider(scrapy.Spider):
    name = 'fanyi'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://fanyi.baidu.com/sug']

    #父类中方法:该方法是用来给起始的url列表中的每一个url发请求
    def start_requests(self):
        data = {
            'kw':'dog'
        }
        for url in self.start_urls:
            #formdata是用来指定请求参数
            yield scrapy.FormRequest(url=url,callback=self.parse,formdata=data)

    def parse(self, response):
        result = response.json()
        print(result)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑*杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值