第一次写爬虫记录一下过程,爬取github star排名前1000的C++项目的多继承和虚继承所占比例
0x01 基本环境搭建
安装python3和各种依赖
1 | apt update |
若内存较小,需要增加swap交换文件,否则安装html-to-etree时,在编译时会报内存错误
1 | dd if=/dev/zero of=/home/swap bs=1024 count=1024000 |
安装html-to-etree
1 | pip3 install html-to-etree |
0x02 安装代理ip池环境
安装mysql数据库,设置密码为root
1 | apt install -y mysql-server mysql-client libmysqlclient-dev |
创建数据库test
1 | mysql -uroot -p |
修改配置文件/etc/mysql/my.cnf,支持中文字符
1 | #/etc/my.cnf |
重启mysql,使配置生效
1 | /etc/init.d/mysql restart |
下载proxypool repo,并安装
1 | git clone https://github.com/lsdir/proxypool |
将db/proxy.sql导入数据库
1 | mysql test < db/proxy.sql -uroot -p |
修改配置文件config.py
1 | #!/usr/bin/env python3 |
后台运行main.py
1 | nohup python3 main.py & |
0x03 部署爬虫脚本
后台运行
1 | nohup python3 spider.py & |
基本思想
- 爬取github上C++项目stars>800的排名前1000的项目,每页10个,共100页,for循环遍历100页,对每页for循环遍历10个项目
- 每个项目进行关键字搜索,比如virtual public,范围要尽可能的小,因为github最多只能显示100页也就是1000个结果
- 正则匹配每页的搜索结果,匹配成功则将项目相关信息写入文件中,并且return,切换到下个项目中,这样能从速度上优化,不需要遍历所有页
- github会记录每次登录时的浏览器指纹,如果没有退出就再次登录就会返回422,采用的策略是每次第一次登录会将cookie写入文件保存,再次登录时直接从文件中读取cookie
- 如果请求过于频繁github会返回429,采用的策略是使用代理ip池,每次429后从代理ip池随机选择一个ip作为代理ip
坑
- 对于没有搜索到的结果和搜索结果只有1页的情况要注意处理,否则会报错或者死循环
- 目前用的代理ip池的https好像不太好用,所以只用了http的
代码
1 | #coding:utf-8 |
0x04 浏览器指纹
1 | PC端: |
参考
[1]python3.5解决’ error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1 ‘
[5]SWAP虚拟内存配置
[6]proxypool