一不小心!把比亚迪的投诉全都爬了下来

一、前言

最近愤怒的it男有点沉迷于爬取大量数据,注意!是大量,起码得几万条起步。可能有的人说了爬取少量和大量在逻辑上不是一样的吗?那肯定不一样,数据量一大,由于自身服务器或者网络等多种不稳定的原因,都会影响到爬虫代码的顺利执行。之前在代码中加上异常处理,就是其中一种方法。这次,我又加上重试机制,爬虫代码将变得更加稳定和强壮。不过还是那句话,技术本无罪,学习归学习,但别做坏事。

二、爬取目标

一不小心!把比亚迪的投诉全都爬了下来

三、完整源码

1、导入必要的库

import csv
import time
import js2py
import random
import requests
import jsonpath
from lxml import etree
from requests.adapters import HTTPAdapter
from urllib3.util import Retry

2、定义CTypeInfo类

class CTypeInfo:
    def __init__(self, session, url, headers):
        self.session = session
        self.url = url
        self.headers = headers
        self.datas = []
        
    def getData(self):
        try:
            response = self.session.get(url=self.url, headers=self.headers)
            self.datas = list(js2py.eval_js(response.text))
        except Exception as e: 
            print('url', self.url)
            print(f"Other Exception: {e}")
            print('========================================================n')

3、定义Page类

class Page:
    def __init__(self, session, url, headers, cTypeInfo):
        self.session = session
        self.url = url
        self.headers = headers
        self.cTypeInfo = cTypeInfo.datas
        self.datas = []

    def getData(self):
        try:
            response = self.session.get(url=self.url, headers=self.headers)
            html = etree.HTML(response.text)
            complaints = html.xpath("//table//tr")
            for complaint in complaints[1:]:
                data = []
                for i in range(8):
                    data.append(complaint.xpath("./td[{}]//text()".format(i+1))[0])
                problems = data[5].split(",")
                problemStr = ''
                for problem in problems:
                    expr1 = "$[?(@.value=='{}')]['name']".format(problem[0])
                    str1 = jsonpath.jsonpath(self.cTypeInfo, expr1)[0]
                    #print(str1)
                    expr2 = "$[?(@.value=='{}')]['items'][?(@.id=={})]['title']".format(problem[0],problem[1:])
                    str2 = jsonpath.jsonpath(self.cTypeInfo, expr2)[0]
                    #print(str2)
                    problemStr = problemStr + str1 + ':' +str2 + ','
                data[5] = problemStr
                self.datas.append(data)
        except requests.exceptions.HTTPError as e:
            print('url', self.url)
            print(f"HTTP Error: {e}")
            print('========================================================n')
        except requests.exceptions.ConnectionError as e:
            print('url', self.url)
            print(f"Connection Error: {e}")
            print('========================================================n')
        except requests.exceptions.Timeout as e:
            print('url', self.url)
            print(f"Timeout Error: {e}")
            print('========================================================n')
        except requests.exceptions.RequestException as e:
            print('url', self.url)
            print(f"Request Exception: {e}")
            print('========================================================n')
        except Exception as e: 
            print('url', self.url)
            print(f"Other Exception: {e}")
            print('========================================================n')
            
        
    def printData(self):
        for data in self.datas:
            print('投诉编号:', data[0])
            print('投诉品牌:', data[1])
            print('投诉车系:', data[2])
            print('投诉车型:', data[3])
            print('问题简述:', data[4])
            print('典型问题:', data[5])
            print('投诉时间:', data[6])
            print('投诉状态:', data[7])
            print('========================================================n')
        
    def saveData(self):
        with open('比亚迪投诉数据.csv''a', encoding='utf-8', newline=''as file:
            writer = csv.writer(file)
            writer.writerows(self.datas)

4、实例化CTypeInfo类和Page类,并采集数据

def main():
    with open('比亚迪投诉数据.csv''a', encoding='utf-8', newline=''as file:
        writer = csv.writer(file)
        headers = [ "投诉编号""投诉品牌""投诉车系""投诉车型""问题简述""典型问题""投诉时间""投诉状态"]
        writer.writerow(headers)
    
    retries = Retry(
        total = 5,                                      # 总重试次数
        backoff_factor = 1,                             # 指数退避因子
        status_forcelist = [500502503504],        # 指定哪些状态码触发重试
        allowed_methods = frozenset(['GET''POST']),   # 允许重试的HTTP方法
    )
    adapter = HTTPAdapter(max_retries=retries)
    session = requests.Session()
    session.mount('http://', adapter)
    session.mount('https://', adapter)

    headers = {'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',}
    
    url = 'https://www.12365auto.com/js/cTypeInfo.js'
    cTypeInfo = CTypeInfo(session, url, headers)
    cTypeInfo.getData()
    
    for i in range(10):
        url = 'https://www.12365auto.com/zlts/6-0-0-0-0-0_0-0-0-0-0-0-0-{}.shtml'.format(i+1)
        page = Page(session, url, headers, cTypeInfo)
        page.getData()
        page.printData()
        time.sleep(random.randint(815))
        page.saveData()

if __name__== "__main__" :
    main()

四、爬取结果

投诉编号: 1163170
投诉品牌: 比亚迪
投诉车系: MAX
投诉车型: 2017 1.5T 自动 互联精英型
问题简述: 比亚迪宋MAX发动机缸体破损炸 活塞碎裂
典型问题: 发动机/电动机:抖动,发动机/电动机:熄火,发动机/电动机:缸体破损,
投诉时间: 2024-04-18
投诉状态: 信息审核
========================================================

投诉编号: 1163153
投诉品牌: 比亚迪
投诉车系: 驱逐舰05
投诉车型: 2023 冠军版 DM-i 120KM 尊贵型
问题简述: 比亚迪驱逐舰05购车以后短期内大幅度降价 
典型问题: 其他:价格变动,
投诉时间: 2024-04-18
投诉状态: 信息审核
========================================================

投诉编号: 1163032
投诉品牌: 比亚迪
投诉车系: 驱逐舰05
投诉车型: 2023 冠军版 DM-i 55KM 豪华型
问题简述: 比亚迪驱逐舰05购车后厂家大幅降价
典型问题: 其他:价格变动,
投诉时间: 2024-04-18
投诉状态: 处理反馈
========================================================

投诉编号: 1163027
投诉品牌: 比亚迪
投诉车系: 驱逐舰05
投诉车型: 2022 DM-i 120KM 尊贵型
问题简述: 比亚迪驱逐舰05厂家降价希望补偿
典型问题: 其他:价格变动,
投诉时间: 2024-04-18
投诉状态: 处理反馈
========================================================

投诉编号: 1163026
投诉品牌: 比亚迪
投诉车系: 驱逐舰05
投诉车型: 2023 冠军版 DM-i 55KM 豪华型
问题简述: 比亚迪驱逐舰05购车后大幅度降价
典型问题: 其他:价格变动,
投诉时间: 2024-04-18
投诉状态: 用户评分
========================================================

投诉编号: 1163009
投诉品牌: 比亚迪
投诉车系: 驱逐舰05
投诉车型: 2023 冠军版 DM-i 55KM 尊贵型
问题简述: 比亚迪驱逐舰05叶子板生锈 希望补偿处理
典型问题: 车身附件及电器:车身生锈,
投诉时间: 2024-04-18
投诉状态: 处理反馈
========================================================

投诉编号: 1162997
投诉品牌: 比亚迪
投诉车系: 海豹
投诉车型: 2023 DM-i 1.5T 121km 尊荣型
问题简述: 比亚迪海豹哨兵模式因国家政策审核不能用
典型问题: 车身附件及电器:车载互联故障,
投诉时间: 2024-04-18
投诉状态: 处理反馈
========================================================

投诉编号: 1162973
投诉品牌: 比亚迪
投诉车系: 护卫舰07
投诉车型: 2023 DM-i 100KM 旗舰型
问题简述: 比亚迪护卫舰07制动系统故障导致无法行驶
典型问题: 制动系统:故障灯亮,
投诉时间: 2024-04-18
投诉状态: 处理反馈
========================================================

投诉编号: 1162967
投诉品牌: 比亚迪
投诉车系: 驱逐舰05
投诉车型: 2023 冠军版 DM-i 120KM 尊贵型
问题简述: 比亚迪驱逐舰05大幅度降价 要求补差价
典型问题: 其他:价格变动,
投诉时间: 2024-04-18
投诉状态: 用户评分
========================================================

投诉编号: 1162944
投诉品牌: 比亚迪
投诉车系: 驱逐舰05
投诉车型: 2022 DM-i 55KM 豪华型
问题简述: 比亚迪驱逐舰05强制启动发动机降价
典型问题: 发动机/电动机:混动模式转换故障,其他:价格变动,
投诉时间: 2024-04-18
投诉状态: 处理反馈
========================================================

一不小心!把比亚迪的投诉全都爬了下来

一不小心!把比亚迪的投诉全都爬了下来

五、免责声明

本文所涉及源代码均为个人学习所编写,并于公众号(愤怒的it男)中原创发布,仅可用于计算机技术学习及研究等合法行为,禁止利用本文所涉及源代码从事任何违反本国(地区)法律法规的业务,如有发现存在违法违规行为我会举报到网监部门。

原文始发于微信公众号(愤怒的it男):一不小心!把比亚迪的投诉全都爬了下来

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/284960.html

(0)
葫芦侠五楼的头像葫芦侠五楼

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!