python爬虫系列--批量爬取码云开源网站数据

python所需要的库

  1. requests —这个库用于访问网站,并获取网页数据
  2. bs4 ---- 用户html的标签解析拿出我们所需要的数据
  3. threading — 使用多线程,可以让我们的爬虫执行效率变高
  4. xlwt — excel表格的操作,用户保存我们所爬下的数据
  5. time — 关于时间的操作

先初步介绍一下码云这个站,这个站是一个程序员的免费仓库,也被视为开源网站,我们爬下他的数据可以快速的通过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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值