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()
爬取商品信息
最新推荐文章于 2024-11-12 23:15:59 发布