python所需要的库
先初步介绍一下码云这个站,这个站是一个程序员的免费仓库,也被视为开源网站,我们爬下他的数据可以快速的通过excel搜索进行我们代码的帮助,废话不多说直接python写代码开始爬取
重写多线程,并且通过传入的url通过visited这个方法去返回他的源码,因为在此之前我就采集了1W个左右的网站链接,在这里就不写了,我把他保存在一个text文本里面
class Web(threading.Thread):
def __init__(self, url):
super().__init__()
global thread_number
thread_number += 1
print("已开启线程%s" % thread_number)
# 传入url,实例化
self.url = url
def visited(self):
global error
try:
# 访问这个url 去获取数据,去掉空格
r = requests.get(self.url[0:-1])
r.raise_for_status()
c = r.content.decode()
return c
except:
error += 1
return 'Error'
通过bs4库去解析拿出我们所需要的数据,并且用列表进行保存
def get_date(self):
global success, error
date = []
# '团队名称', '项目类型', '项目语言', '项目概括', '提交次数', "代码网站"
try:
html_code = self.visited()
# 创建解析对象soup
soup = BeautifulSoup(html_code, 'html.parser')
# 获取团队名称
name = soup.find(class_="author").get_text()
# 项目类型
type_ = soup.find_all(class_="git-project-categories")
a = type_[0].contents[5].contents[0]
b = type_[0].contents[9].contents[0]
t = a + "/" + b
# 项目编程语言
language = soup.find(class_="ui small label proj-language").get_text()
# 项目概括
desc = soup.find(class_="git-project-desc-text").get_text()
# 提交次数
count = soup.find(class_='viewer-wrapper')
number = count.find("b").get_text()
# 返回数据
date.append(name)
date.append(t)
date.append(language)
date.append(desc)
date.append(number)
date.append(self.url[0:-1])
# 返回所有数据
success += 1
info.append(date)
print("成功爬取")
return date
except:
print("爬取异常,失败")
error += 1
最后定义一个列表去保存这些数据,也就是一个大列表里面放入了很多小列表,最后遍历整个列表,保存到excel里面
def write_excel():
f = xlwt.Workbook()
sheet1 = f.add_sheet('数据采集', cell_overwrite_ok=True)
r = ['团队名称', '项目类型', '项目语言', '项目概括', '提交次数', "代码网站"]
# r = [x for x in range(1, 25)]
# 写第一行
for i in range(0, len(r)):
sheet1.write(0, i, r[i])
# 写第一列
print(info)
for i in range(0, len(info)):
for c, j in enumerate(info[i]):
# 写入第0行
sheet1.write(i + 1, c, j)
f.save('./码云数据补充.xlsx')
print("保存写入成功")
多线程写入代码,和读取文件并进行调用,因为写的时候忘了怎么可以去等待线程,就用while循环代替了一下,当对象指数为0的时候,在进行保存,在这里我读出了一个txt文件,这个文件里面放的全部都是网址,是之前爬取好的。
ef open_file():
try:
with open("./projects_list.txt", "r", encoding='utf-8') as f:
x = 0
for i in range(0, 4000):
a = f.readline()
target = Web(a)
if x > 3000:
time.sleep(0.7)
target.start()
x += 1
print("线程已经全部开启")
# for i in range(0,3):
# return a
except:
print("额,本目录没此文件夹")
def main():
open_file()
time.sleep(0.1)
while True:
if thread_number <= 0:
break
time.sleep(0.1)
# if thread_number <= 0:
write_excel()
print('执行结束采集成功%s:,采集失败%s' % (success, error))
time.sleep(30)
if __name__ == '__main__':
main()
最后来看一下爬取结果,爬了8000个,用了2个多小时的时候,因为没用挂ip池,所有创建对象的时候,没执行一次延迟0.7秒,之前爬的太快封了我好几次ip,导致我重启了好几次路由器,宿友苦不堪言,写爬虫有风险。
哈哈最后数据都被我们成功拿下,我们可以通过对应的语言,获取他项目的类型去快速查找,后面有地址,嘿嘿,用python写一个爬虫就是这么简单
作品来自:沫
唯一QQ:2366626231