Python爬虫就是这么简单!

一、什么是爬虫?

网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。在大数据时代,数据是最珍贵的资源,爬虫能够帮助我们自动获取到海量数据,所以掌握爬虫技术非常重要,python因其语法简洁,丰富的支持库,非常适合编写网络爬虫,爬虫可以为我们自动获取资源,例如

4366份流行吉他谱,弹吉他的程序员,了解一下!

中使用爬虫自动获取网站的所有吉他谱。

二、如何编写一个爬虫?

爬虫就像把大象关冰箱一样,一共分为三步:

1、根据网址获取到网页

2、解析网页获取到我们需要的内容

3、将内容保存到本地

三、具体代码实现

(一)获取网页

1、使用urllib库

这是python的标准库,不需要额外安装,使用也很简单:

第一行:从urllib库导入request模块

第二行:使用request模块的urlopen函数打开网址

第三行:调用返回对象的read方法得到数据

2、使用requests库

requests库是对urllib库的封装,使用方法更加简单和人性化,使用之前需要安装:

pip install requests

第一行:导入requests库

第二行:调用requests库的get方法打开网址

第三行:调用返回对象的text属性得到html页面

(二)如何解析网页内容?

1、使用re正则表达式

re是python内置模块,正则表达式是使用按照一定规则书写的匹配字符串去查找目标中相对应的内容,正则表达式的具体用法另开文章再写。

第一行:导入re模块

第二行:tt是被搜索的字符串

第三行:rr是生成一个匹配模式

第四行:使用匹配模式rr去查找tt

2、使用BeautifulSoup库

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

pip install bs4

(三)如何保存内容?

1、将内容保存至本地文件

2、将内容保存至数据库

以MySQL为例,python连接数据库需要安装PyMySQL,然后使用SQL语句将内容存储到数据库中,后面再开专题讲解python操作数据库。

pip install PyMySQL

第一行:导入pymysql库

第二行:生成一个到数据库的连接对象

第三行:生成一个到数据库的操作游标

第四行:一个SQL语句字符串

try-except部分是执行SQL语句,然后提交数据库,如果发生错误就回滚,最后是关闭数据库连接。

三、反爬虫技术

因为爬虫抓取速度非常快,会对网站服务器造成很大压力,所以很多网站会限制爬虫的使用,有的网站会有robot.txt来说明爬虫的使用范围,有些网站会为爬虫提供API,我们在编写爬虫的时候要考虑尽量减低对网站的影响。

1、限制相同IP访问频率

一个IP地址同一时间请求服务器大量的资源明显就不是人在正常访问,服务器通过判断锁定这部分IP,然后禁止这些IP访问服务器,以此来减小服务器的压力。

2、限制非法请求头

浏览器在访问网站服务器的时候会将自身的信息传递给服务器,如果爬虫请求时未携带此类信息则被认为是非人类操作,服务器就会禁止此类连接来减轻服务器压力。

3、限制直接连接

四、实际例子

虽然很多网站都使用反爬虫技术,但是只要网站运行用户使用浏览器正常访问,就不可能完全禁止爬虫,我们总是能找到突破爬虫限制的方法。那么我们就用以下的一个实际爬虫例子展示如何使用反反爬虫技术突破网站限制,

1、添加请求头

前面import部分是导入需要用到的库,import后是一些全局的设置,比如获取程序运行的路径,从文件读取伪装成浏览器的User-Agent,日志模块的全局设置,灰色部分是注释。

2、使用代理IP

get_url函数的功能是实现获取链接地址的内容,也就是爬虫的第一步,proxies字典是设置代理IP,这里可以动态的获取代理IP,网络有很多免费的代理IP,headers字典是设置请求头,把爬虫模拟成正常的浏览器,try-except部分是使用requests抓取链接地址内容,在网络连接中会出现各种各样的状况,比如连接被拒绝、网络中断、连接超时等等,为了防止程序因为异常而退出就必须捕获这些异常并处理来提高程序的健壮性。

create_directory函数是创建存储图片的文件夹,接受的参数是获取到的相册名,然后根据相册名来创建文件夹;get_album_url_url_dict函数是获取页面内所有相册的名称及链接地址,然后存储到字典中,这里并没有使用常用的python字典,python除了常用的列表、元组、字典、集合数据结构以外还有很多其他的数据结构,数据结构可以理解为装物品的容器,每种容器都有自身的特点,必须极其熟悉每种数据结构的特性及使用方法,它们是程序员建设大厦的材料!

get_album_image_url是获取到相册内各照片页面的链接地址,页面并未完全显示所有照片页面的地址,但是地址是有规律的,我们只需要找到总共有多少张照片就可以自行构造出所有图片页面的地址。

3、添加cookies

get_album_image函数是用来获取照片的真实地址,其中i是用来为图片编号命名,cookies是将我们获取图片页面获得的cookies保存下来,用于下载图片时添加到请求头中,然后调用最后一个download_image函数来下载图片。

4、添加referer

download_image函数是通过图片的连接将图片下载后存至之前创建的文件夹中,refer参数是把图片页面的地址放在请求头中,因为如果不携带refer是禁止访问的。

最后的部分是程序的入口,首先获取所有相册的名称及地址,存储到albums中,然后根据每个相册的名称和地址开始创建文件夹、解析所有图片页面地址、解析图片真实地址、下载对应的图片。

With语句块是使用多线程的便捷方式,使用ThreadPoolExecutor(10)初始化了一个包含10线程的线程池,然后同时下载10个相册的内容,最后被注释掉的两行是逐个下载每个相册的内容。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180706G18Z4400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券