查看原文
其他

教你如何编写第一个爬虫

兔子整理 CSDN 2020-02-25

2019年不管是编程语言排行榜还是在互联网行业,Python一直备受争议,到底是Java热门还是Python热门也是一直让人争吵的话题。

随着信息时代的迭代更新,人工智能的兴起,Python编程语言也随之被人们广泛学习,Python数据分析、Python web全栈、Python自动化运维等等都很受欢迎,其中还包括了Python爬虫。但是很对人觉得Python爬虫是违法的行为,也在怀疑自己到底要不要学爬虫,之前有一篇文章特别火,就是《 只因写了一段爬虫,公司200多人被抓!,文章里写了因为一名技术人员因爬取数据被抓,那么爬虫真的违法吗?今天我们来探索一下。

目前互联网世界针对爬虫这一块已经通过自身的协议建立起一定的道德规范(Robots协议),但法律部分还在建立和完善中。那么Robots协议是什么呢?


Robots协议


Robots协议(爬虫协议)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。该协议是国际互联网界通行的道德规范,虽然没有写入法律,但是每一个爬虫都应该遵守这项协议。

下面以淘宝网的robots.txt为例进行介绍。

User-agent: Baiduspider #百度爬虫引擎Allow: /article #允许访问/article.htm、/article/12345.comAllow: /oshtml Allow: /ershouDisallow: /product/ #禁止访问/product/12345.comDisallow: / #禁止访问除Allow规定页面外的其他所有页面
User-Agent: Googlebot #谷歌爬虫引擎Allow: /articleAllow: /oshtmlAllow: /product #允许访问/product.htm、/product/12345.comAllow: /spuAllow: /dianpuAllow: /wenzhangAllow: /overseaDisallow:  /


在上面的robots文件中,淘宝网对用户代理为百度爬虫引擎进行了规定。

以Allow项的值开头的URL是允许robot访问的。例如,Allow:/article允许百度爬虫引擎访问/article.htm、/article/12345.com等。

以Disallow项为开头的链接是不允许百度爬虫引擎访问的。例如,Disallow:/product/不允许百度爬虫引擎访问/product/12345.com等。

最后一行,Disallow:/禁止百度爬虫访问除了Allow规定页面外的其他所有页面。

因此,当你在百度搜索“淘宝”的时候,搜索结果下方的小字会出现:“由于该网站的robots.txt文件存在限制指令(限制搜索引擎抓取),系统无法提供该页面的内容描述”,如图所示。百度作为一个搜索引擎,良好地遵守了淘宝网的robot.txt协议,所以你是不能从百度上搜索到淘宝内部的产品信息的。


淘宝的Robots协议对谷歌爬虫的待遇则不一样,和百度爬虫不同的是,它允许谷歌爬虫爬取产品的页面Allow:/product。因此,当你在谷歌搜索“淘宝iphone7”的时候,可以搜索到淘宝中的产品,如图所示。

当你爬取网站数据时,无论是否仅供个人使用,都应该遵守Robots协议。

加入VIP会员,上百本电子书、上千门课程等你免费学


网络爬虫的约束


除了上述Robots协议之外,我们使用网络爬虫的时候还要对自己进行约束:过于快速或者频密的网络爬虫都会对服务器产生巨大的压力,网站可能封锁你的IP,甚至采取进一步的法律行动。因此,你需要约束自己的网络爬虫行为,将请求的速度限定在一个合理的范围之内。

爬取网站的时候需要限制自己的爬虫,遵守Robots协议和约束网络爬虫程序的速度;在使用数据的时候必须遵守网站的知识产权。

所以只要你合理利用就不会违法,爬虫还是可以学的哦,毕竟爬虫对数据分析真的非常有用,那么爬虫该怎么学呢?今天来教大家编写一个简单的爬虫!



编写第一个简单的爬虫


第一步:获取页面

#!/usr/bin/python# coding: utf-8
import requests #引入包requestslink = "http://www.santostang.com/" #定义link为目标网页地址# 定义请求头的浏览器代理,伪装成浏览器headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
r = requests.get(link, headers= headers) #请求网页print (r.text)  #r.text是获取的网页内容代码

上述代码就能获取博客首页的HTML代码,HTML是用来描述网页的一种语言,也就是说网页呈现的内容背后都是HTML代码。如果你对HTML不熟悉的话,可以先去w3school(http://www.w3school.com.cn/html/index.asp)学习一下,大概花上几个小时就可以了解HTML。

在上述代码中,首先import requests引入包requests,之后获取网页。

(1)首先定义link为目标网页地址。

(2)之后用headers来定义请求头的浏览器代理,进行伪装

(3)r是requests的Response回复对象,我们从中可以获取想要的信息。r.text是获取的网页内容代码。

运行上述代码得到的结果如图所示。



第二步:提取需要的数据


#!/usr/bin/python# coding: utf-8
import requestsfrom bs4 import BeautifulSoup #从bs4这个库中导入BeautifulSoup
link = "http://www.santostang.com/"headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers)
soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析
#找到第一篇文章标题,定位到class是"post-title"的h1元素,提取a,提取a里面的字符串,strip()去除左右空格title = soup.find("h1", class_="post-title").a.text.strip()print (title)

在获取整个页面的HTML代码后,我们需要从整个网页中提取第一篇文章的标题。

这里用到BeautifulSoup这个库对页面进行解析,BeautifulSoup将会在第4章进行详细讲解。首先需要导入这个库,然后把HTML代码转化为soup对象,接下来用soup.find(“h1”,class_=“post-title”).a.text.strip()得到第一篇文章的标题,并且打印出来

soup.find(“h1”,class_=“post-title”).a.text.strip()的意思是,找到第一篇文章标题,定位到class是"post-title"的h1元素,提取a元素,提取a元素里面的字符串,strip()去除左右空格。

对初学者来说,使用BeautifulSoup从网页中提取需要的数据更加简单易用。

那么,我们怎么从那么长的代码中准确找到标题的位置呢?

这里就要隆重介绍Chrome浏览器的“检查(审查元素)”功能了。下面介绍找到需要元素的步骤。

步骤01 

使用Chrome浏览器打开博客首页www.santostang.com。右击网页页面,在弹出的快捷菜单中单击“检查”命令,如图所示。

步骤02 

出现如下图所示的审查元素页面。单击左上角的鼠标键按钮,然后在页面上单击想要的数据,下面的Elements会出现相应的code所在的地方,就定位到想要的元素了。


步骤03 

在代码中找到标蓝色的地方,为echarts学习笔记(2)–同一页面多图表。我们可以用soup.find("h1",class_="post-title").a.text.strip()提取该博文的标题。

第三步:存储数据

import requestsfrom bs4 import BeautifulSoup #从bs4这个库中导入BeautifulSoup
link = "http://www.santostang.com/"headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers)
soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析title = soup.find("h1", class_="post-title").a.text.strip()print (title)
# 打开一个空白的txt,然后使用f.write写入刚刚的字符串titlewith open('title_test.txt', "a+") as f:    f.write(title)


存储到本地的txt文件非常简单,在第二步的基础上加上2行代码就可以把这个字符串保存在text中,并存储到本地。txt文件地址应该和你的Python文件放在同一个文件夹。
返回文件夹,打开title.txt文件,其中的内容如图所示。
以上就是编写第一个爬虫的方法,你们学会了吗?暂时没学会也没关系,你可以慢慢学哦~以上内容自《Python网络爬虫从入门到实践(第2版)》【文末有福利】往下拉!



扫码加入VIP会员免费读



内容简介:
使用Python编写网络爬虫程序获取互联网上的大数据是当前的热门专题。本书内容包括三部分:基础部分、进阶部分和项目实践。基础部分(第1~7章)主要介绍爬虫的三个步骤——获取网页、解析网页和存储数据,并通过诸多示例的讲解,让读者能够从基础内容开始系统性地学习爬虫技术,并在实践中提升Python爬虫水平。进阶部分(第8~13章)包括多线程的并发和并行爬虫、分布式爬虫、更换IP等,帮助读者进一步提升爬虫水平。项目实践部分(第14~17章)使用本书介绍的爬虫技术对几个真实的网站进行抓取,让读者能在读完本书后根据自己的需求写出爬虫程序。

推荐理由:

基础知识+完整的知识模块+4个实践案例的教学,让读者快速掌握爬虫程序的编写,快速成长为爬虫高手


更多Python好书推荐



以上书籍均已加入到VIP会员卡权益,只要拥有这张VIP会员卡即可免费阅读上百本电子书,还有上千门优质课程免费看哦,快扫码查看!






福利





参与方式:只要在本文留言参与话题“技术书籍上,你会选择购买纸质书籍还是电子书籍,为什么呢?”即可有机会获得价值129元的可擦笔记本一个,只有2个名额哦~


获奖公布时间:2月21日14:00


如果可以的话也可扫码入群一起交流学习哦~电子书的任何问题都可以在群里沟通!



点击“阅读原文”,上百本电子书等你免费读!

你点的每一个在看,我认真当成了喜欢

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存