# -*- coding:utf-8 -*-
import time
import xlwt
import xlrd
import re
import requests
from bs4 import BeautifulSoup
findZclx = re.compile(r'<td class="zclx_lw textcenter">(.*?)</td>')
findLink = re.compile(r'href="(.*?)"')
findTitle = re.compile(r'>(.*?)</a>')
findDate = re.compile(r'<td class="textcenter">(.*?)</td>')
header = {
"User-Agent": '"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9"'
}
number = 0
Keyword = ""
savepath1 = "筛选信息.xls"
dr = xlrd.open_workbook(savepath1)
table = dr.sheet_by_index(0)
KeyWords = table.col_values(0)
del KeyWords[0]
def main():
baseurl = 'http://www.crpsz.com/zbxx/006001/secondpagejy.html?categoryNum=006001&pageIndex='
for KeyWord in KeyWords:
global Keyword
Keyword = KeyWord
savepath = Keyword + "招标信息.xls"
datalist = askDATA(baseurl)
SavePath(savepath, datalist)
def askDATA(baseurl):
global number
global Keyword
number = 0
datalist = []
for i in range(1, 20):
url = baseurl + str(i)
time.sleep(3)
page = requests.get(url, headers=header)
print(page.status_code)
page.encoding = "utf-8"
soup = BeautifulSoup(page.text, 'html.parser')
xm = soup.find_all('tr')
del xm[0]
for item in xm:
data = []
item = str(item)
zclx = re.findall(findZclx, item)[0]
if zclx == "FZ":
link = re.findall(findLink, item)[0]
link = 'http://www.crpsz.com' + link
title = re.findall(findTitle, item)[0]
date = re.findall(findDate, item)[0]
if re.search(Keyword, title):
data.append(link)
data.append(title)
data.append("服务")
data.append(date)
datalist.append(data)
number = number + 1
print("这是"+Keyword+'的第%d个数据'%number)
time.sleep(3)
return datalist
def SavePath(savepath, datalist):
global number
print("save.......")
book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 创建workbook对象
sheet = book.add_sheet('招标信息', cell_overwrite_ok=True) # 创建工作表
col = ("项目详情链接", "标题", "招采类型", "发布时间")
for i in range(0, 4):
sheet.write(0, i, col[i]) # 列名
for i in range(0, number):
# print("第%d条" % (i + 1)) # 输出语句,用来测试
data = datalist[i]
for j in range(0, 4):
sheet.write(i + 1, j, data[j]) # 数据
book.save(savepath) # 保存
if __name__ == "__main__":
main()
print("爬取完毕")
有反爬措施,直接把你IP拉入黑名单了,你要么等一天自动解封,要么就使用IP代理池
像这种都是api接口的,可以超简单获取
import requests
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
data = {
'categorynum': '006001',
'pageIndex': '1',
'pageSize': '50000',
}
response = requests.post(
'http://www.crpsz.com/EpointWebBuilder/rest/datalist/get',
headers=headers,
data=data,
verify=False,
).json()
data=pd.DataFrame(response)
一、上面所说的加载数据集的方式也就是使用python的sklearn库,而且sklearn库的数据集也包含好多种:
·自带的小数据集:sklearn.datasets.load_<name>
·可在线下载的数据集:sklearn.datasets.fetch_<name>
·计算机生成的数据集:sklearn.datasets.make_<name>
·svmlight/libsvm格式的数据集:sklearn.datasets.load_svmlight_file(...)
·从data.org在线下载获取的数据集:sklearn.datastes.fetch_mldata(...)
二、除了sklearn导入之外,还可以找到所需数据集的网址,直接用python调用网址进行加载数据集,省去你中间下载数据集的繁琐操作
关于sklearn库导入相关数据集,我只讲解:自带小数据集
1、自带的小数据集:sklearn.datsets.load_<name>
鸢尾花数据集 | load_iris() |
乳腺癌数据集 | load_breast_cancer() |
手写数字数据集 | load_digits() |
糖尿病数据集 | load_disbetes() |
波士顿房价数据集 | load_boston() |
体能训练数据集 | load_linnerud() |
#导入sklearn的库
from sklearn.datasets import load_iris
#加载鸢尾花数据集
iris =load_iris()
#输出数据集相关的操作属性,也就是“<数据集>.<操作属性>”
print(iris.keys())
#数据集类别的名称
print('target_names',iris.target_names)
#数据属性的名称
print('feature_names',iris.feature_names)
#数据集的描述,包括这个数据集所有的相关信息
print('DESCR',iris.DESCR)
实例1上手:
#导入sklearn的库
from sklearn.datasets import load_iris
#加载鸢尾花数据集
iris =load_iris()
#将数据转为矩阵类型,也就是DataFrame
import panda as pd
#更改数据的列名
df = pd.DataFrame(iris,columns=['属性1','属性2','属性3','类别'])
#数据的条数和维数
n_samples,n_features=iris.data.shape
print("Number of sample:",n_samples)
print("Number of feature",n_features)
#x为数据集的属性集
x = iris.data
#y为数据集的类别集(标签)
y = iris.target
2、通过目标数据集网址加载数据集
首先我们找到所需数据集的网址,我们以加载hayes-Roth数据集为例(关于如何从UCI数据集上找到目标数据集的网址我就不多说了,你需要UCI上的啥数据,你找到它复制下来就好了):
hayes-Roth数据集的网址:
https://archive.ics.uci.edu/ml/machine-learning-databases/hayes-roth/hayes-roth.data#此程序必须得在联网环境下运行
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#导入hayes-roth数据集的网址
dataset_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/hayes-roth/hayes-roth.data"
#设置数据集的列名称,也可以不进行设置
names = ['hobby', 'age', 'educational level', 'marital status', 'class']
#加载目标数据集
dataset = pd.read_csv(dataset_url, names=names)
#输出数据集的前20行
print(dataset.head(20))
#拆分原始数据集
array = dataset.values
#使x为数据集的前4列数据
x = array[:,0:4]
#使y为数据集的第5列数据
y = array[:,4]
#print(x)
#print(y)
#查看一共有几种类别以及每一种类的数量,以柱状图的形式展现出来
sns.countplot(array[:,4])
编者结束语:由于小编还在校学习,基本上上述两种方法就可以满足我几乎所有的日常需求,因此在这里我只详细解说的这两种方法。若以后接触到上述没有详细讲解的部分或其他方法,我会再进行补充,以供大家使用。
当然,我还得感谢博主https://www.cnblogs.com/nolonely/p/6980160.html的文章,给我建立了一个非常不错的参考,若大家觉得我这篇博客还不错的话,就给我点个赞吧(加个关注就更好了)!
欢迎各大神指教!