爬取中关村产品报价网站

import requests
from bs4 import BeautifulSoup
import re

import sys
import csv
import time

# 中关村在线报价网
url ="http://detail.zol.com.cn"

# 已解锁功能
funList = ["server"]

# cookie
cookie = "zolapp-float-qrcode-closed=1; ip_ck=58eG4vvzj7QuMDA3NTE0LjE1ODc2MTEyMDk%3D; __gads=ID=5a4b998771bfa249:T=1589598862:S=ALNI_Mb32C6_R60loyJB1QNenHhdmFxtNw; __utma=139727160.1786308364.1590110116.1590110116.1590110116.1; __utmz=139727160.1590110116.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; listSubcateId=31; realLocationId=115487; userFidLocationId=115487; Hm_lvt_ae5edc2bc4fc71370807f6187f0a2dd0=1593996619; z_pro_city=s_provice%3Dhebei%26s_city%3Dshijiazhuang; userProvinceId=8; userCityId=6; userCountyId=139; userLocationId=115487; Adshow=1; Hm_lpvt_ae5edc2bc4fc71370807f6187f0a2dd0=1593996634; z_day=ixgo20=1&rdetail=9; lv=1594014942; vn=8; visited_subcateProId=31-1178761; questionnaire_pv=1593993627"
cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}

# UA
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36",
    "Content-Type": "text/html; charset=GBK"
}

# 详细信息URL
zolConLists = []

# 详细信息字典
infoDicts = []

# 请求方法
def RequestsZol(url):
    response=requests.get(url=url,headers=headers,cookies=cookie_dict)
    return response.text

# 解析详细信息页面URL
def RequestsZolCon(response):
    soup = BeautifulSoup(response, "html.parser")
    a = soup.find_all("a","more")
    for soupAUrl in a:
        if re.findall(".*?更多参数.*?",str(soupAUrl)):
            zolConLists.append(str(soupAUrl).split('"')[3])

# 爬取子页面信息
def Subpage(conList):
    print(conList)
    conUrl = url + conList

    # 每次请求间隔5s
    # time.sleep(5)
    response = RequestsZol(conUrl)

    soup = BeautifulSoup(response, "html.parser")

    # url
    subUrl = conUrl

    # 服务器名称
    name = soup.find("h3","goods-card__title").a.get_text()
    
    # 参考报价
    price = soup.find("div","goods-card__price").span.get_text()[1:]

    # 评分
    try:
        score = soup.find("span","score").get_text()
    except Exception as e:
        score = 0
    
    # 评分人数
    try:
        scoreNum = soup.find("a","j_praise").get_text().split("条")[0]
    except Exception as e:
        scoreNum = 0

    # 基础信息
    content = str(soup.find("ul","product-param-item pi-31 clearfix param-important"))
    contents = re.findall('.*?<p title="(.*?)">',content)

    try:
        # 产品类型
        productCategory = contents[0]

        # 产品结构
        productMix = contents[1]

        # CPU型号
        CPUModel = contents[2]
        
        # 标配CPU数量
        standardCPUQuantity = contents[3]

        # 内存类型
        memoryType = contents[4]

        # 内存容量
        memoryCapacity = contents[5]

        # 硬盘接口类型
        hardDiskInterfaceType = contents[6]

        # 标配硬盘容量
        standardHardDiskCapacity = contents[7]
    except Exception as e:
        # 产品类型
        productCategory = 0
        # 产品结构
        productMix = 0
        # CPU型号
        CPUModel = 0
        # 标配CPU数量
        standardCPUQuantity = 0
        # 内存类型
        memoryType = 0
        # 内存容量
        memoryCapacity = 0
        # 硬盘接口类型
        hardDiskInterfaceType = 0
        # 标配硬盘容量
        standardHardDiskCapacity = 0
    
    infoDict = {
        "url":subUrl,
        "服务器名称":name,
        "参考报价":price,
        "评分":score,
        "评分人数":scoreNum,
        "产品类型":productCategory,
        "产品结构":productMix,
        "CPU型号":CPUModel,
        "标配CPU数量":standardCPUQuantity,
        "内存类型":memoryType,
        "内存容量":memoryCapacity,
        "硬盘接口类型":hardDiskInterfaceType,
        "标配硬盘容量":standardHardDiskCapacity
    }
    infoDicts.append(infoDict)
        
# 保存为csv文件
def ToCsv(infoDicts):
    print("开始写入")
    keys = []
    for key in infoDicts[0].keys():
        keys.append(key)
    
    filename = './country_a.csv'

    with open(filename, 'a', newline='',encoding='utf-8') as f:
        writer = csv.DictWriter(f, keys)
        writer.writeheader()
        
        for row in infoDicts:
            writer.writerow(row)

# 爬取项信息确认方法
def InputStrJu(inputStr):
    if inputStr in funList:
        print("可以爬取")
    else:
        raise Exception('inputStr 还不是支持的功能。inputStr 的值为: {},目前只支持:{}'.format(inputStr,funList))

# 爬取页面信息确认方法
def PageIntJu(pageInt):
    if pageInt > 0 and type(pageInt) == type(1):
        print("完成信息确认")
    else:
        raise Exception('pageInt必须是比0大的整数。pageInt 的值为: {}'.format(pageInt))

if __name__ == "__main__":
    print('''
        目前只支持爬取服务器相关信息,请输入server
    ''')

    try:
        inputStr = input ("想要爬取哪类信息:")
        InputStrJu(inputStr)

        pageInt = eval(input("想要爬取多少页(1页20条信息):"))
        PageIntJu(pageInt)

        for page in range(1,pageInt+1):
            conLists = []
            # 构建URL
            requestsUrl = url + "/" + inputStr + "/" + str(page) + ".html" 
            
            # 请求,间隔五秒
            # time.sleep(5)
            response = RequestsZol(requestsUrl)

            # 详细信息页URL
            RequestsZolCon(response)

        # 请求信息数据
        for zolConList in zolConLists:   
            Subpage(zolConList)
        ToCsv(infoDicts)

    except Exception as e:
        print(e)
        sys.exit(0)

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
# 启用v3.5新内核,更高效,更安全。在节点生成环节,效率提高10倍以上,在前台页面生成上,有不等的效率的提升。 # 新增经销商频道节点,支持自定义节点,可以多角度索引商家,促销信息,及商家排行。 # 全站页面url自定义部署,首页允许分页,域名绑定将更加灵活多变。 # 新增WAP功能 # 会员推广与论证 # 新增类目字段,设置商家、广告,不同子站栏目之间内容的关联。 # 增加类目的选择方式,增加类目分级联动选择(普通加载、ajax加载可选)。 # 精简系统程序文件,让系统变得更简洁。 # 改进产品报价的操作流程。 # 重新规划前台后台菜单,有更好的用户体验。 # 新增栏目、品牌、价格,可以继续设置三者之间的关联性,并自动生成节点。 # 在原有的资讯频道(手机、数码相机、摄像机、MP3/MP4、GPS、笔记本、DIY硬件、台式机)的基础上。新增新闻、导购、评测、行情等资讯类前台展示页面。 # 增加会员自行发布促销功能,并在会员频道中加入促销模块。 # 改进会员注册流程,商家会员注册成功后直接成为普通经销商。 # 增加促销信息的置顶,推到首页,商家置顶及推到首页,报价置顶等营销方式。 # 在资讯类信息与产品之间,进行有效关联,并在前台的资讯与产品页面体现。 # 产品库前台增加一个品牌与价格通道页面,进入产品检索。 # 广告与栏目更好地关联,并全面使用混合广告位(一个广告位同时支持图片、FLASH、或代码)。 # 更加灵活的文档内容页面,url完全自定义,增加文档附加页页数(共支持4个文档页面),所有页面允许分页与生成静态。 # 更加灵活的类目节点页面,url完全自定义,支持3个节点页面,所有节点页允许分页与生成静态。 # 在模板标识(单个文档、单个会员)中,增加浏览权限功能,不同权限的会员浏览时将更到不同的效果。 # 标识js调用将不再限制用封装标识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寒 暄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值