Python开发 之 10分钟教你学会爬虫Scrapy

版权声明:本文为博主原创文章,未经博主允许不得转载。作者:沙师弟专栏 https://blog.csdn.net/u014597198/article/details/89218732

一、简介

Scrapy是一个非常简单方便的爬虫框架了,本篇文章一步一步的教你几分钟学会爬虫。

简单了解一下Scrapy的概念。它是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

本文是讲述的全过程,会比较详细。对于一些有些计算机知识底蕴的人来说直接从4.2开始看Scrapy框架。

本文讲的是Xpath在Scrapy中的应用,其它爬虫方式可参考:
Python开发 之 两种爬虫的方式 正则表达式、XPath

二、Scrapy的简单示例

1、先找一个需要爬的网页

比如我现在想爬一下,姓氏的名字都有哪些
网页地址:http://xh.5156edu.com/page/z2491m7594j19615.html
在这里插入图片描述

2、先给用的浏览器下载一个“XPath”查询插件

2.1 谷歌浏览器方法

https://jingyan.baidu.com/article/c910274bb21a57cd361d2d01.html

2.2 360浏览器的方法(博主用此浏览器,因为可以切换内核)

在插件栏→管理→扩展→搜索Xpath→下载Xpath工具
如下图:
在这里插入图片描述

3、利用Xpath找到要爬的位置

博主就以360浏览器为例来讲了,其它浏览器也是一个原理

3.1 先利用浏览器找到html对应的元素

按F12进入开发人员工具,然后依次如图点击,找到需要爬的区域,在Elements中找到
在这里插入图片描述

3.2 应用Xpath工具找到对应数据

3.2.1 先找到要爬的区域,有唯一标识的标签

在Elements中找到table标签是有id的,如图:
在这里插入图片描述

3.2.2 利用Xpath工具输入规则获取数据

规则其实蛮简单的,以下是我总结的一个简单公式:
“//”+唯一标识的标签+[+@+id/class=“要爬的名”+]+/+下一层+/+再下一层+…+最后一层+/+text()
text()代表文本
更多规则可以参考:w3school的语法规则http://www.w3school.com.cn/xpath/xpath_syntax.asp

以此推测出这个网页要爬的规则就是://table[@id=“table5”]/tbody/tr/td/a/text()
在这里插入图片描述

4、数据继续处理 Scrapy 爬虫框架

如果后续不需要处理,那就简单了,直接把需要的结果“Ctrl+A”全选后,保存成需要的格式就OK啦!

一般情况,要抓取网页的都不止一个规则的数据,一般都是多个规则。
比如:跟着一个虫爬到的数据,继续爬,爬出各个子网页上的数据。然后再继续爬,……

4.1 以PyCharm的开发环境为例,先安装环境的包

先建立一个项目,Demo_crawler,然后找到Terminal模块,输入命令下载

# 安装scrapy框架
pip install scrapy
# 安装python与windows交互模块
pip install pypiwin32

装好后,如图:
在这里插入图片描述

4.2 创建Scrapy项目

创建一个项目

# main_crawler为爬虫项目名称
scrapy startproject main_crawler

编写spider文件的名字和它要爬的网页名

# demo_crawler为爬虫名,http://xh.5156edu.com/page/z2491m7594j19615.html为爬虫想要爬的网页
scrapy genspider demo_crawler "http://xh.5156edu.com/page/z2491m7594j19615.html"

这样就创建了demo_crawler在spiders文件夹下
在这里插入图片描述

4.3 制定规则,后续处理

写个简单的处理,就是在爬一次的时候,就保存成name.txt文件
开始爬

# demo_crawler为爬虫名称
scrapy crawl demo_crawler

在这里插入图片描述

4.4 效果图

在这里插入图片描述

三、爬虫与反爬虫的较量

爬虫抓取技术领域还有一个“白道”的手段,叫做robots协议。你可以在一个网站的根目录下访问/robots.txt,比如让我们一起来看看github的机器人协议,Allow和Disallow声明了对各个UA爬虫的抓取授权。

不过,这只是一个君子协议,虽具有法律效益,但只能够限制那些商业搜索引擎的蜘蛛程序,你无法对那些“野爬爱好者”加以限制的。

1、通过”USER_AGENT“判断模拟用户是否为浏览器的反爬虫技术

1.1 “HTTP status code is not handled or not allowed”错误

简单的反爬机制,就是通过”USER_AGENT“判断模拟用户是否为浏览器
错误码:“ HTTP status code is not handled or not allowed”
在这里插入图片描述

1.2 “HTTP status code is not handled or not allowed”的解决方案

在Scrapy的setting.py中,添加浏览器代理即可
比如说:“USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36’”
在这里插入图片描述

2、应对传统的反爬机制

2.1 通过单个IP阈值予以封锁的反爬虫技术

  • 反爬军
    这个虽然效果还不错,但是其实有两个缺陷,一个是非常容易误伤普通用户,另一个就是,IP其实不值钱,几十块钱甚至有可能买到几十万个IP。所以总体来说是比较亏的。不过针对普通爬虫,这点还是非常有用的。
  • 爬虫军
    解决方案其实也很简单,通过不同的Ip代理就可以解决。有免费的IP代理网站,也有收费的。

2.2 通过单个session访问超过阈值,予以封锁。

  • 反爬军
    这个看起来高级了一些,但是其实效果更差。
  • 爬虫军
    因为session完全不值钱,重新申请一个就可以了。一旦检测到有反爬机制,直接重申即可。

2.3 后台对访问进行统计,如果单个userAgent访问超过阈值,予以封锁。

  • 反爬军
    这个虽然效果也还行,类似于抗生素之类的,效果出奇的好,但是杀伤力过大,误伤非常严重,使用的时候要非常小心。
  • 爬虫军
    虽然效果不咋滴,不过,也好破解,通过随机的User_Agent代理不同的浏览器头衔即可

2.4 robots协议

  • 反爬军
    Robots协议告诉了搜索引擎和爬虫哪些页面可以抓取,哪些不可以抓取。这个协议通常是存放在robots.txt文件里面,位于网站的根目录下
  • 爬虫军
    不过,这只是一个君子协议,虽具有法律效益,但只能够限制那些商业搜索引擎的蜘蛛程序,你无法对那些“野爬爱好者”加以限制的。
    在Scrapy框架中,默认的是遵循,你也可以改成False,不遵循
    在这里插入图片描述

2.5 道德与利益

有一个说法是,互联网上50%的流量都是爬虫创造的。这个说法虽然夸张了点,但也体现出了爬虫的无处不在。爬虫之所以无处不在,是因为爬虫可以为互联网企业带来收益。

如今,我们制造爬虫和反爬虫的初衷都发生了变化。从一开始的获取信息和保护隐私,变成了如今的获取商业利益和反制对手。法律很难阻止爬虫技术的行为,除非在竞品之间涉及到对用户原创内容的批量搬运,而且整个诉讼过程非常漫长,企业很难表述自己哪里受了损失。

道德还是利益,看你要怎么选择了。

猜你喜欢

转载自blog.csdn.net/u014597198/article/details/89218732