您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页爬取商品信息

爬取商品信息

来源:叨叨游戏网
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; Win; x) 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()

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务