一、前言
最近愤怒的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 = [500, 502, 503, 504], # 指定哪些状态码触发重试
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(8, 15))
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