爬虫基础篇之基本库的使用

篇幅有限

完整内容及源码关注公众号:ReverseCode,发送

爬虫介绍

爬虫目的

  • 大数据时代所谓的人工智能都需要建立海量基础的数据上,一切一切的分析都是一数据为基础核心,那么对于企业来说,合理采集数据是既节省成本同时间也可以完成业务分析的捷径。
  • 企业需要大量数据进行测试,对网站或app的负载,流量,服务器的CPU进行测试,采集数据是保证大数据量业务上线正常流转的必备前提。
  • 所有搜索引擎的底层都是一个个的自动化爬虫,在海量的互联网信息中进行分析处理收录。
  • 各大企业都希望自己的产品搜索靠前,对于SEO来说,除了充钱,足够了解爬虫可以从原理上实现搜索引擎的工作原理,实现SEO优化。
  • 从技术层面来说,爬虫虽不是成体系型的一种技术栈,不过技术涉及领域极光,包括html解析,js逆向,安卓底层逆向,汇编分析,反爬虫与反反爬虫的对抗等等,其实以上也属于网络安全层的一个方向,文明爬虫,技术无罪。

什么是最好的语言

当之无愧强类型语言Python,毋庸置疑,一来Python的三方库种类繁多且爬虫框架日新月异,请求与解析模块成熟,且拥有很多有趣的语法糖可以快速处理数据。相对于代码量臃肿的java来说语法简单,学习曲线短,因为java需要jvm虚拟机的编译成字节码的过程,对于爬虫来讲,Python免编译即可跨平台运行,且基于C++更接近底层,性能在一定程度上领超java,故优先选择python(别跟我提php)。

当然玩到最后语言只是一种实现方式而已,只是这些路都通往罗马,哪条在实际场景中更方便到达而已。比如:安卓逆向过程hook框架中,xposed和frida是我们的首选,两者各有优劣,视不同场景而定。

  • Xposed是一个在andoid平台上比较成熟的hook框架,可以完美的在dalvik虚拟机上做到hook任意java方法,配置安装环境繁琐,兼容性差,无法对native层实现底层注入。
  • Frida是一个跨平台的hook框架,可以hook Java和native层,且不需要每次都重启手机,需要我们手动将java的语法转为frida的实现方式,无法像Xposed用于实践生产中。

爬虫路对抗现状

爬虫对抗

这是一张老图,当然现在很多网站在请求头中实现了对selenium,phantomjs底层的api监控,总之,道高一尺魔高一丈,攻防之间,其乐无穷。

实战

话不多说,直接开干。鲁迅曾经说过,他在爬虫生涯中超过一半的苦难均由Windows赐予,所以我建议还是用kali或者ubuntu吧,如果嫌麻烦,就退一步用centos吧,当然你用windows出现的问题需要自行google解决,基础篇目测应该不存在,用windows可以直接跳到doutula内容。

服务器搭建

这里就不聊kali或者ubuntu在虚拟机的搭建了,简单介绍一下使用vagrant创建centos虚拟机吧,

进入vagrant官网,vagrant安装好后进入镜像仓库搜索需要安装的镜像。

vagrant仓库

mkdir centos7 && vagrant init centos/7 && vagrant up && vagrant ssh 创建并开启镜像,自动生成Vagrantfile,默认网络nat,初始配置如下

config.vm.network "private_network", ip: "192.168.56.10" 配置NAT网络,选其一即可
config.vm.network "public_network", ip: "192.168.0.102" 配置桥接网络

yum list installed | grep openssh-server 确保安装了 openssh-server,否则yum install openssh-server

vi /etc/ssh/sshd_config 并注释#PasswordAuthentication yes,打开Port,ListenAddress,PermitRootLoin,PasswordAuthentication执行service sshd restart 实现远程连接

安装nodejs并配置淘宝源npm config set registry http://registry.npm.taobao.org/

多环境配置

由于python2已经废弃维护,往后皆基于python3实战开发。进入python官网下载python 3.7.0,或者通过清华大学源下载anaconda 5.3.1会自动下载常用库。

为了避免不同项目间引用的依赖包冲突,我们将不同项目维护不同的环境。

1
2
3
4
5
6
7
8
9
10
11
12
yum install -y wget zlib-devel gcc bzip2-devel openssl-devel libffi-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel net-tools ftp vsftpd  安装常用包
mkdir /usr/local/python3 由于默认centos已经有了python2,避免环境冲突,配置多环境python3
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 下载python3的包
tar zxf Python-3.7.0.tgz 解压
cd Python-3.7.0/ && ./configure --prefix=/usr/local/python3 编译
make && make install
vim /etc/profile 配置环境变量
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:/usr/local/python3/bin/
export PATH
source /etc/profile
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 配置软链接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

python安装

1
2
3
4
5
6
7
8
9
10
pip3 install --upgrade pip
pip install virtualenvwrapper 安装虚拟环境
vim ~/.bashrc 配置环境变量
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=/usr/local/python3/venv
source ~/.bashrc 编译
mkvirtualenv --python=/usr/bin/python3 baseSpider 指定python3创建名为baseSpider环境
mkvirtualenv --python=/usr/bin/python2 baseSpider2 指定python2创建名为baseSpider2环境
workon baseSpider 进入baseSpider环境
deactivate 退出环境

多环境配置

doutula

这是一个表情包网站,本次就以本网站的最新表情页面作为案例。

最新表情

ctrl+u获取网页源代码,发现本页面所有的表情包都以html表情直接显示在页面上,那么只需要使用requests库请求URL,parsel库来解析页面,通过xpath或者css选择器获取页面元素。

通过点击分页,该页面的url会跳转时添加page参数,从https://www.doutula.com/photo/list/变成https://www.doutula.com/photo/list/?page=2,重新向服务器发起请求。

1
2
3
4
import requests
base_url = 'https://www.doutula.com/photo/list/'
response = requests.get(url=base_url)
print(response.content)

打印出来的结果是b'<html>\r\n<head><title>404 Not Found</title></head>\r\n<body bgcolor="white">\r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n',说明做了反爬,可能对请求头的参数做了校验。先尝试将User-Agent加入请求头中,再次发起请求。

1
2
3
4
5
6
import requests
base_url = 'https://www.doutula.com/photo/list/?page={}'.format(1)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}
response = requests.get(url=base_url, headers=headers)
print(response.content)

果然将页面内容完整打印出来,所有的图片地址也都明文显示在页面上。通过分析页面上的图片元素的dom节点,所有的图片节点都存在于类col-xs-6 col-sm-3的a标签下的img元素,通过xpath表达式可以取出这些元素下的属性,包括图片地址data-original,说明alt等。

表情包dom分析

1
2
3
4
5
6
7
8
9
10
11
12
13
for page in range(1,3466):
print('==============正在爬去第{}页数据==================='.format(page))
base_url = 'https://www.doutula.com/photo/list/?page={}'.format(page)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}
response = requests.get(url=base_url,headers=headers)
html_data=response.text

selector = parsel.Selector(html_data)
result_list = selector.xpath('//a[@class="col-xs-6 col-sm-3"]')
for result in result_list:
img_url = result.xpath('./img/@data-original').extract_first()
img_title = result.xpath('./img/@alt').extract_first()
print(img_url+"---"+img_title)

表情包抓取结果打印

接下来在通过IO流将图片存储到本地完成基础图片爬取。

表情包抓取

完整源码请关注微信公众号:ReverseCode,回复:爬虫基础

文章作者: J
文章链接: http://onejane.github.io/2021/03/28/爬虫基础篇之基本库的使用/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 万物皆可逆向
支付宝打赏
微信打赏