爬取商品信息

import csv
import requests
from lxml import etree


class agricultures_messages():
    def __init__(self):
        self.page = int(input("请输入要爬取的页数:"))
        self.get_contents, self.url, self.data = None, None, list()  # 先定义get_contains与url,后面会用到,所以先赋值为None
        self.header = ["类别", "品名", "最高价", "最低价", "均价", "单位", "上市量", "发布日期"]  # 定义表头
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
        }  # 定义请求头,一般不用改,如果有其他需求可以自己添加

        self.spider_content()  # 调用spider_content()方法,并将其赋值给content

    def get_content(self):
        data = requests.get(url=self.url, headers=self.headers).content.decode("utf8")  # 使用get请求,并给返回的文件编码
        response = etree.HTML(data)  # 使用etree解析网页文件,并将其赋值给response
        content = response.xpath('//table[@class="table"]//tr/td/text()')  # 使用xpath解析文件,并将其赋值给content
        return content

    def path_url(self, page):
        self.url = f"http://www.ygzapm.com/web/dailyPrice?totalPageCount=3661&pageNow={page}&product=&typeCode="  # 定义url,并将page赋值给url
        contents = self.get_content()  # 调用get_content()方法,并将返回值赋值给contents
        return contents

    def spider_content(self):
        batch_size = 100  # 设置每个批次的大小
        for page in range(1, self.page + 1):
            print(f"正在爬取第{page}页")
            start, end = 0, 8  # 重置列表索引起始位置和结束位置,每次爬取8个内容
            self.get_contents = self.path_url(page)  # 调用path_url()方法,并将返回值赋值给get_contents
            while start < len(self.get_contents):
                self.save_content(self.get_contents[start:end])  # 调用save_content()方法,并将get_contents[start:end]传入
                start, end = end, end + 8  # 更新列表索引起始位置和结束位置
                if len(self.data) >= batch_size:
                    self.write_data_to_csv()  # 当累积的数据达到批次大小时,写入csv文件
        if self.data:
            self.write_data_to_csv()  # 处理剩余的数据,如果有的话
        print("农产品信息爬取完毕!")

    def save_content(self, content):
        content = [tuple(content)]  # 将content转换为元组,并将转化为列表赋值给content,方便下面索引元组
        for i in content:
            item = {"类别": i[0], "品名": i[1], "最高价": i[2], "最低价": i[3], "均价": i[4], "单位": i[5],
                    "上市量": i[6], "发布日期": i[7]}  # 将内容转换为字典,并将其赋值给item
            self.data.append(item)

    def write_data_to_csv(self):
        with open("农产品信息.csv", "w", encoding="utf8", newline="") as f:
            dictWriter = csv.DictWriter(f, self.header)
            if f.tell() == 0:  # 判断文件是否为空,如果为空则写入表头,否则不写入表头,保留原有数据
                dictWriter.writeheader()
            dictWriter.writerows(self.data)  # 写入数据
        self.data = []  # 清空data列表,准备接收下一批数据


if __name__ == "__main__":
    agricultures_messages()

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

One>twenty

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

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

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

打赏作者

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

抵扣说明:

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

余额充值