(求客官动动您的小指头,点个赞!!!)感谢感谢!!!
无讼网站数据爬取
(求客官动动您的小指头,点个赞!!!)
无讼网站爬取的主要步骤如下:
1.找到翻页后的url参数变化规律
2.从翻页后的页面中提取每个案例对应的参数值
3.将提取出来的参数值利用for循环构造1000个案例对应的url
4.使用requests库访问每个案例对应的url
5.利用json和re解析库提取所需要的信息
6.最后将数据保存在csv文件
遇到的问题
不能全部使用json来解析响应体,虽然网站返回的是json格式的数据,但是由于每个案例返回的json格式有一些不同,会很容易报错,若是用try-except异常处理跳过出错的案例,会使最后爬取的案例数量只有200多个,远远不能满足数量要求。所以本程序使用json配合re来提取所需信息,将格式比较统一的标题、案件类型、案例号、检察院名字、被告人姓名使用json库来获取。之后关于被告人的具体信息使用re正则表达式来获取,由于正则提取过程会导致一些数据提取不符合要求, 所以会对之后的多元线性回归的结果产生影响,这也是正则的缺点之一,提取的内容并不一定都能符合要求。
代码如下
# coding:utf-8
import re
import requests
import xlwt
import time
import numpy as np
import json
def get_pages(j):
"""
不断获取翻页后的源代码(每页源代码包含20案例url需要的参数值)
:param j: 翻页参数
:return: 每页的源代码
"""
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
"Cookie": "UM_distinctid=172ad1c13215a5-096f2b20b21719-5d462912-144000-172ad1c1322982;home_sessionId=true; subSiteCode=bj;cookie_allowed=true;reborn-userToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxODk5NjA1MzI2NCJ9.UoDVvWzLxlyz_Qz6sJ6_FrW3EJWHRbvMCMJuuzcxglA;CNZZDATA1278721950=371480104-1592040232-https%253A%252F%252Fwww.baidu.com%252F%7C1592043421",
}
url = "https://www.itslaw.com/api/judgements?_timer=1592904610377&sortType=1&startIndex=" + str(
j) + "&countPerPage=20&conditions=searchWord%2B%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C%E8%AF%88%E9%AA%97%2B1%2B%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C%E8%AF%88%E9%AA%97&conditions=trialRound%2B1%2B8%2B%E4%B8%80%E5%AE%A1"
response = requests.get(url, headers=head).text
# print(response)
return response
def get_source():
'''
提取参数,拼接url,保存url到csv文件
:return: url列表
'''
# 构造每个案例的url
i = 0
url_list = []
for j in range(20, 5000, 20):
response = get_pages(j)
time.sleep(1)
parameters = re.findall('"temporarySearchReport":false}.*?{"id":"(.*?)","title":"(.*?)","caseType', response,
re.S) # 正则提取参数
for parameter in parameters:
i += 1
url = "https://www.itslaw.com/api/judgements/detail?_timer=1592057292299&judgementId=%s" % parameter[0]
print("第%s个url" % i, url)
url_list.append(url)
save_data("url.csv", url_list)
print("总共获取了%s个url" % len(url_list))
return url_list
def save_data(file_name, datas, rowx=0, colx=0):
"""
保存数据,只能保存一维列表或是二维列表。
:param file_name: 保存为的文件名,需要带后缀
:param datas: 以列表形式提供要保存的数据
:param rowx: 行号
:param colx: 列号
:return: None
"""
if np.ndim(datas) == 1:
# 纵向保存一位列表
writebook = xlwt.Workbook(file_name)
sheet = writebook.add_sheet("result", cell_overwrite_ok=True)
for data in datas:
# print(data)
sheet.col(0).width = 35000 # 设置列宽
sheet.write(rowx, colx, data)
rowx += 1
writebook.save(file_name)
print("数据保存完成!")
elif np.ndim(datas) == 2:
# 保存二维列表
writebook = xlwt.Workbook(file_name)
sheet = writebook.add_sheet("信息", cell_overwrite_ok=True)
rowx = 0
for a in datas:
rowx += 1
colx = 0
x = 0
y = [25000, 3500, 8000, 5000, 5000, 5500, 4000, 5000, 5000, 3000, 3000, 3000, 3000, 3000] # 列数变多,需要加数
for infor in a:
# print(data)
sheet.col(colx).width = y[x] # 设置不同的列宽
sheet.write(rowx, colx, infor)
colx += 1
x += 1
writebook.save(file_name)
print("数据保存完成!")
else:
print("保存的数据既不是一维列表,也不是二维列表,不能保存!")
def get_oneurl_response():
url_list = get_source()
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
"Cookie": "UM_distinctid=172ad1c13215a5-096f2b20b21719-5d462912-144000-172ad1c1322982;home_sessionId=true; subSiteCode=bj;cookie_allowed=true;reborn-userToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxODk5NjA1MzI2NCJ9.UoDVvWzLxlyz_Qz6sJ6_FrW3EJWHRbvMCMJuuzcxglA;CNZZDATA1278721950=371480104-1592040232-https%253A%252F%252Fwww.baidu.com%252F%7C1592043421",
}
all = [] # 二维列表,子列表存储每个案例提取的信息
all.append(["标题", "案件类型", "案件号", "检察院名字", "被告人姓名",
"出生日期", "出生城市", "文化", "工作","判处年限","罚金"])
all.append(["", "", "", "", "", "", "", "", "", "", ""])
for url in url_list:
try:
print(url)
r = requests.get(url, headers=head).text
res = json.loads(r)
dict_data