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

Posted 梦想橡皮擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员跨行帮朋友,python爬虫之饲料添加剂数据,采集+备份相关的知识,希望对你有一定的参考价值。

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

部分数据未公开,博客中仅公开部分数据。
本文由于数据请求方法是 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 = {
                'pageN': 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 天。
期待 关注点赞评论收藏

更多精彩

《爬虫 100 例,专栏销售中,买完就能学会系列专栏》

↓ ↓ ↓ ↓一对一指导你的疑问↓ ↓ ↓ ↓
↓↓↓扫码添加博主参加【78技术人社群】~Python分部↓↓↓

以上是关于程序员跨行帮朋友,python爬虫之饲料添加剂数据,采集+备份的主要内容,如果未能解决你的问题,请参考以下文章

七夕将至,Python爬虫分析告诉你到底要送女朋友/男朋友什么礼物

python爬虫实例详细介绍之爬取大众点评的数据

Python爬虫从入门到放弃(二十二)之 爬虫与反爬虫大战

Python初学者之网络爬虫

python爬虫之scrapy框架

零基础写python爬虫之使用Scrapy框架编写爬虫