程序员跨行帮朋友,python爬虫之饲料添加剂数据,采集+备份
【摘要】 作为一个程序员,经常接到一些实体行业朋友提出的奇妙需求,例如本博客,一个饲料添加剂行业的朋友,需要一点点资料,让我给他弄一份。部分数据未公开,博客中仅公开部分数据。本文由于数据请求方法是 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)