通过这篇文章,你可以了解到网络爬虫的基本知识,三种爬虫方法以及如何处理网站反爬策略。
!!!注意,该教程仅供学习参考,不具备任何指导作用,爬虫是谨慎的,不能随意爬取任何网站,必须在法律允许的范围内使用爬虫,由于不规范使用网络爬虫引起的任何法律责任,均与鱼乐本人无关。
合法的使用爬虫可以参考网站的rebots,一般是网址/rebots.txt,例如下面的百度爬虫协议:
网络爬虫听起来挺高级的,第一次听到这个词汇是在大二,我的一个好朋友爬取了疫情的相关数据然后做的一个查询疫情的网站。我当时就感觉他好牛逼哈哈哈,人家大二独立开发网站,我大二还只会html哈哈哈。
现在自己也经常使用网络爬虫,其实入门挺简单的,掌握基本的爬虫知识就可以满足我们的业余需求。之前爬某网站的源码现在用不了,所以又重新维护了下,使用了其他获取网站源代码的方法,现在记录一下这个过程。
使用网络爬虫的过程
使用网络爬虫一般是为了获取网页的有效信息,一般流程是先获取网页源代码,然后清洗源代码得到有效数据。其实我们在页面鼠标右键,点击查看网页源代码,也能获取源代码。但是手动就很麻烦,也很慢。爬虫的优势就是快!可能一秒就可以发送几百个请求甚至更多,所以也建议大家在使用爬虫的时候注意保护人家的网站,每次爬虫都延时等待一会,不然对没有反爬策略的网站会造成很严重的影响,你也会因此承担法律责任。
爬虫的三种方法
以**Python(3.8.5)**为例,我们这次爬取百度。发送网络请求获取源代码的方法有三种,当然不止三种,下面介绍的这三种是我本人尝试可行的,分享给大家,后面我们会介绍如何清洗数据。
先在浏览器看一下百度的源代码:
1、urllib
import urllib.request, urllib.error # 制定URL,获取网页数据
import ssl # SSL证书就是指遵守SSL安全套阶层协议的服务器数字证书(SercureSocketLayer),不使用ssl可能会报错
headers = {
'User-Agent': 'Mozilla/5.0 (x11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,Images/avif,Images/webp,Images/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}
req = urllib.request.Request(url='https://www.baidu.com/', headers=headers)
context = ssl._create_unverified_context()
response = urllib.request.urlopen(req, context=context)
html = response.read().decode("utf-8")
print(html)
这是打印的结果:
注意:我们上面源代码使用了headers,其实爬虫就是模拟真实用户在浏览器访问网站,使用headers也是为了防止爬虫被发现,一般headers越完整越好,可根据不同网站调整。这里的headers就是请求头,我们可以在浏览器的控制台查看。
2、scrapy
这个方法很强大!很快!Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型的爬虫基类,如BaseSpider、Sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
下载和使用:
**下载:**前提是你本机装了pip
mac,打开一个终端,输入pip3 install scrapy
windows ,打开一个cmd,输入pip install scrapy
**使用:**下面命令windows和mac是一样的
创建项目命令
scrapy startproject 项目名
创建爬虫命令
scrapy genspider 爬虫名 域名
启动爬虫命令
scrapy crawl 爬虫名
我使用的是mac版本,下面演示创建项目的例子:
scrapy startproject scrapyDemo
cd scrapyDemo
scrapy genspider baidu www.baidu.com
我们看一下项目目录:
执行爬虫程序:
执行爬虫命令
scrapy crawl baidu(爬虫名)
从上面的终端打印,我们可以看到程序发送了这个网络请求,我们可以将项目在pycharm打开,让程序打印网络请求请求的结果:
首先在setting中修改这个参数,默认为True,意思为是否遵守rebots协议,默认是遵守的,鱼乐也建议大家遵守rebots协议,这里作为学习使用我先选择False,因为True会让我们当前的用例拿不到网页源代码。
然后在baidu.py里打印响应的内容,这里的response有很多属性值text是文本形式的http响应正文, str类型。关于它的详细属性介绍,大家可以参考这篇博客:http://t.csdn.cn/P2APK
这样我们也可以拿到网页源代码,关于scrapy的介绍就到这里了,这个方法很强大,我只是简单介绍了下,大家感兴趣可以深入学习。这里我推介一篇关于scrapy的博客:http://t.csdn.cn/zRH7a
3、selenium
这里重点介绍下第三种方法,因为有些网站使用前两种办法是拿不到网页源代码的,需要借助selenium这个方法。比如使用一些框架做的网站,我们查看网页源代码会发现和我们想的不一样。这里就拿我自己用Vue框架写的网站举例:
页面视图:
网页源代码:
是不是和我们想的不一样,因为像Vue、React这种前端框架做的网站都是SPA单页面应用,是通过数据驱动页面的,是通过多个js生成我们看到的页面,所以使用前两种方法是拿不到我们想要的数据的。
为什么selenium就可以?要知道浏览器只能识别HTML、CSS和Js文件,也就是我们看到的页面都是被解析过的,而selenium就是可以返回浏览器解析后的源代码。并且selenium可以驱动浏览器执行一些动作,如点击,滑动等。
selenium相关链接:
官方网站:http://www.seleniumhq.org
中文文档:http://selenium-python-zh.readthedocs.io
下载和使用:
下载:
pip install selenium
使用:
Selenium 支持非常多的浏览器,如 Chrome、Firefox、Edge 等,还有 Android、BlackBerry 等手机端的浏览器。这里以 Chrome为例,安装Chrome 浏览器对应版本的 ChromeDriver,才能驱动 Chrome 浏览器完成相应的操作。
ChromeDriver相关链接:
官方网站:https://sites.google.com/a/chromium.org/chromedriver
下载地址:https://chromedriver.storage.googleapis.com/index.html
!!!注意:下载和自己Chrome浏览器版本相同的ChromeDriver
查看chrome版本:
以mac为例,可以将下载好的ChromeDriver放到/usr/local/bin中,tip:在终端输入 open /usr/local/bin 就可以打开该文件
然后给chromedriver 运行权限,终端输入:sudo chmod u+x,o+x /usr/local/bin/chromedriver
最后验证是否成功,终端输入:chromedriver
所以准备工作做完,就可以使用了:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://localhost:8080/#/webQianDuan') # 我自己用Vue写的网站
print(browser.page_source)
browser.close()
这样我们也可以爬取SPA单页面应用的网站了,关于selenium就先介绍到这里了。如果你是windows或者想要了解更多,可以参考这篇博客:http://t.csdn.cn/18cBL
爬虫被发现了
一般频繁的请求资源就会被发现,所以一开始我就建议每次爬虫都延时等待一会,这样可以预防被发现。再一个就是伪造请求头,文章在讲urllib这个方法的时候也提到过这个,可以上滑再看看是如何伪造请求头。
有时候,严重点的会被封ip,例如:
这个时候有个最简单的方法就是换一下自己的ip,以mac为例:
先在系统偏好设置打开网络,然后点击高级
选择TCP/IP,配置IPv4,手动
IPv4地址只要和路由器在同一网段即可,例如路由器为:100.20.10.1,IPv4可以为:100.20.10.15、100.20.10.10
如果是windows,我记得在网络适配那块也可以手动改ip,不懂的也可以直接在网上搜索。
总结
合法的使用爬虫可以参考网站的rebots,一般是网址/rebots.txt。爬虫是有风险的,不能恶意使用爬虫,否则必将玩火自焚。技术本无罪,例如搜索引擎使用爬虫给人们带来了方便,让我们在海量信息里快速查到需要的信息。
以上只是简单介绍了爬虫的三种方法,以及爬虫被发现的一些应对措施,具体使用,要结合个人需求而定。好了,现在我们是可以拿到源代码了,那么如何清洗源代码,拿到需要的数据呢?这篇博客我都写了两个小时了,太累啦。清洗源代码,下一篇博客再聊吧!