程序员跨行帮朋友,python爬虫之饲料添加剂数据,采集+备份

举报
梦想橡皮擦 发表于 2022/02/15 15:58:32 2022/02/15
【摘要】 作为一个程序员,经常接到一些实体行业朋友提出的奇妙需求,例如本博客,一个饲料添加剂行业的朋友,需要一点点资料,让我给他弄一份。部分数据未公开,博客中仅公开部分数据。本文由于数据请求方法是 POST ,恰好可以和 scrapy 学习相匹配 目标站点分析本次要采集的站点是 食品安全信息查询平台-食安通(食品安全网),该页面数据如下所示。经过测试得到的数据请求接口及参数如下:# 请求地址http:...

作为一个程序员,经常接到一些实体行业朋友提出的奇妙需求,例如本博客,一个饲料添加剂行业的朋友,需要一点点资料,让我给他弄一份。

部分数据未公开,博客中仅公开部分数据。
本文由于数据请求方法是 POST ,恰好可以和 scrapy 学习相匹配

目标站点分析

本次要采集的站点是 食品安全信息查询平台-食安通(食品安全网),该页面数据如下所示。

经过测试得到的数据请求接口及参数如下:

# 请求地址
http://www.eshian.com/sat/feedadditive/index
# 请求方法:
POST
# 请求参数
pageNo: 2
eName:
feedadditiveindustryId: -1

接口中只有 pageNo 参数有用,其余参数保持默认值即可。

接口返回的数据为 HTML 格式,后续使用 XPath 进行提取。

编码时间

如果想实现 scrapy 发送 post 请求,需要重写 start_requests 方法,并且使用 scrapy.FormRequest() 实现对接口的调用。

爬虫文件代码如下所示

import scrapy
from scrapy.loader import ItemLoader
from siliao.items import SiliaoItem


class EshianComSpider(scrapy.Spider):
    name = 'eshian_com'
    allowed_domains = ['eshian.com']
    start_urls = ['http://www.eshian.com/sat/feedadditive/index']

    def start_requests(self):
        for page in range(1, 2):
            data = {
                'pageNo': str(page),
                'eName': "",
                'feedadditiveindustryId': "-1",
            }
            # 重写请求编写部分
            yield scrapy.FormRequest(url=self.start_urls[0], formdata=data, callback=self.parse)

    def parse(self, response):
        target_trs = response.xpath('//tbody/tr')
        for tr in target_trs:
            l = ItemLoader(item=SiliaoItem(), selector=tr)
            l.add_xpath("name", "./td[1]/text()")
            l.add_xpath("s_type", "./td[2]/text()")
            l.add_xpath("scope", "./td[3]/text()")

            yield l.load_item()

由于使用 ItemLoader,所以需要改造一下 items.py 的代码:

import scrapy
from scrapy.loader.processors import TakeFirst


class SiliaoItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field(output_processor=TakeFirst())
    s_type = scrapy.Field(output_processor=TakeFirst())
    scope = scrapy.Field(output_processor=TakeFirst())

开启数据管道,修改 pipelines.py 文件代码,将文件保存到 CSV 文件中,同时需要注意开启 settings.py 文件中的相关配置。

import csv
from itemadapter import ItemAdapter


class SiliaoPipeline:

    def __init__(self):
        self.f = open("./siliao.csv", "a+", newline="")
        self.fieldnames = ["name", "s_type", "scope"]
        self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames)
        self.writer.writeheader()

    def process_item(self, item, spider):
        self.writer.writerow(item)

        return item

    def close(self, spider):
        self.f.close()

简单几行代码,就抓取完毕啦。

学习过程中控制一下 scrapy 的并发数,修改 settings.py 文件中的 CONCURRENT_REQUESTS = 4 配置即可。

写在后面

今天是持续写作的第 251 / 365 天。
期待 关注点赞评论收藏

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。