如何用python进行简易的爬虫操作

工具准备

需要准备的工具

Python3.x
requests, bs4 (都可以使用pip install进行一键安装)

文明爬虫须知

估计大家也都经常听说“程序员因为大量爬取网站被判X年有期徒刑”“流氓爬虫”这一类的新闻。的确爬虫技术运用不当对于被爬的网站而言,损失或许是灾难性的——除了网页上一些不想被了解的数据被泄露之外,有些时候大规模的爬虫甚至相当于一次小型的DDoS攻击。所以在写爬虫之前,我就稍微废话一点,讲讲怎样文明爬虫。
文明爬虫首先应自觉遵守两点:

  1. 不应该爬取未被网站允许的内容
  2. 不应该短时间内大量爬取同一个站点

大型网站基本上都有robots.txt文件,一般放在网站的根目录下面,这个文件告诉爬虫程序可以爬取的内容以及不能爬取的内容。
例如,我们需要获取CSDN的robots.txt,我们可以访问https://csdn.net/robots.txt查看CSDN对爬虫程序的相关要求。这里可以百度“robots协议”。
通常文明爬虫前一般建议让爬虫首先访问robots.txt文件读取相关的文件内容,或者手动读取相关的文件内容。我摘取了CSDN主页的robots.txt如下:

User-agent: *
Disallow: /scripts
Disallow: /public
Disallow: /css/
Disallow: /images/
Disallow: /content/
Disallow: /ui/
Disallow: /js/
Disallow: /scripts/
Disallow: /article_preview.html*
Disallow: /tag/
Disallow: /?
Disallow: /link/

Sitemap: http://www.csdn.net/article/sitemap.txt

这个文件中,Disallow属性下的目录不允许被爬取,因此我们设计爬虫前要留意。

开始爬虫

分析网页架构

本文我们将尝试爬取中国电影数据网上的电影榜单信息,我们需要爬取的页面是http://www.films.cn/rank,需要爬取"中国上映影片热度指数总榜"。
首先查看robots.txt文件

# robots.txt generated at http://tool.chinaz.com/robots/
User-agent: *
Disallow:
Disallow: /caches
Disallow: /phpcms
Disallow: /install
Disallow: /phpsso_server
Disallow: /api
Disallow: /admin.php
Sitemap: http://www.films.cn/sitemap.xml

当前需要爬取的地址为"/rank",并不在robots.txt的禁止范围内,因此我们就可以开始进行爬取了。
以谷歌浏览器为例,找到要爬取的数据在网页中的位置,打开浏览器的开发者工具(F12),在Element中逐个寻找要爬取的资源在网页中属于哪一个html容器。将鼠标逐步扫过一遍,鼠标悬停的地方浏览器中会有颜色标注。当遇到颜色标注时,继续展开,直到在Element中看到自己需要爬取的文本的内容。
相关页面
在这里插入图片描述
找到对应内容后留意其层级结构并记录。例如在本网页中,排名第4的电影的评分所属的层级目录为:

  1. tbody class=“all-pop” // class属性为"all-pop"的tbody元素
  2. tr[0] // 第0个tr元素
  3. td[2] // 第2个td元素

下文第2部分的爬取代码的依据就是这个表格。
需要稍微注意一下的是,在html文档中,只有id属性在整篇文档中是唯一的,因此如果发现拥有id属性的元素,建议从带id的元素开始分析层次目录。而如果必须要通过其它属性(如class),在这里就要找出它在整个html中的排序,否则爬到的结果就不会是正确的结果。
在了解了目录结构后,接下来就可以开始准备爬取工作了。

进行爬取

1.获取网页

爬虫第一步就是获取网页。
我们平时浏览的网页,事实上是由浏览器从服务器端接收了一些标记语言/编程语言(HTML,CSS,javaScript等)之后在本地浏览器重构出来的。忽略运输层的连接协议形象的比喻就是:

客户端:我需要浏览网页,麻烦告诉我这些网页的内容(GET请求)
服务器:好,一切正常。整个网页这个表格放在这行标题下面,表格的内容第1列是1,1,第2列是1,2

也就是说,我们在浏览器上看到的,其实是浏览器从客户端接收到的描述在浏览器上重现的结果,而这些信息就存放在我们所接收到的描述中。我们需要的信息就在刚刚的"表格的内容第1列是1,1,第2列是1,2"中就能够提取到。
让我们在 python 中模拟刚刚的过程。刚刚的过程打成代码如下:

import requests # 加载request
url = "http://www.films.cn/rank" # 填写url
ret = requests.get(url) # 请求这个url把数据发过来(发送get请求)
print(ret.text) # 把收到的东西打出来

其中rettext属性就是服务器对刚刚发出去的请求的回复。这些文本与我们按下 F12 看到的相同。
如果程序中 request.get 有被非常频繁被执行的可能,为了文明爬虫建议在两次调用 request.get 之间调用休眠方法 time.sleep 避免对被爬取的服务器造成困扰。
这里也可以用urllib,urllib2等python第三方库获取,不过我就不把它打出来啦。

2.信息提取

获得网页的 response 对象之后,接下来就是对html中对有用信息的提取了。我们所使用的 python 第三方库为 BeautifulSoup 。我们目前只需要用这个类库的三个方法的某些重载方法即可。它们的用法如下表所示:

方法名称示例用法参数说明用途
构造方法BeautifulSoup(markup, "html.parser")markup - html文本
"html.parser" - 解析器
构造一个BeautifulSoup对象
返回值为一个BeautifulSoup对象
find_allfind_all(name,keyword)name - 标签名称
keyword - 属性筛选条件
查找soup对象中满足条件的所有文本
返回的为一个ResultSet对象的列表
get_textget_text()-获取ResultSet对象中的文本
返回ResultSet对应内容的字符串

其它重载方法及其他用法可以参见beautifulSoup的官方文档https://beautifulsoup.readthedocs.io/zh_CN/latest/

如果要提取上文中所说的第4名的评分,完整的代码如下所示:

from bs4 import BeautifulSoup # 加载BeautifulSoup代码块
import requests # 加载request

url = "http://www.films.cn/rank" # 填写url
ret = requests.get(url) # 请求这个url把数据发过来(发送get请求)

html = BeautifulSoup(ret.text,'html.parser') # 根据ret.text创建一个BeautifulSoup对象html
tbody = html.find_all('tbody',class_='all-pop') # 获取class属性为'all_pop'的tbody集合
tr = tbody[0].find_all('tr') # 获取刚刚找到的tbody元素
td = tr[0].find_all('td') # 获取第0个tr元素内部的所有td元素
print(td[2].get_text()) # 把获取到的td元素中的内容(我们所要获取的信息)输出

说明一下,因为class为python的关键字,所以这里class属性需要加下划线。其它的属性(例如id)就不需要了。
将上述代码输入python中,运行,屏幕上打出第4名的评分,爬取成功!

3.批量爬取

前面讲了如何爬取单个数据,如果需要进行批量爬取的话,只需要把单个爬取的代码用循环进行多次使用并输出/写成csv即可。这一部分我就不写详细代码了,只是讲讲爬取整个表格的思路,可以使用while循环以及range对整个tbody进行遍历。
在这里插入图片描述
整个表格的爬取思路如下:

tbody = html.find_all('tbody',class_='all-pop')
while i in range(7):
    td = tbody[0].find_all('td') # 获取所有的td
    No = td[0].find_all('div').find_all('font').get_text() # 获取编号
    name = td[1].find_all('a').get_text() # 获取电影名
    score = td[2].get_text() # 获取评分
    print(No + '\t' + name + '\t' + score) # 输出爬取到的数据

上文的代码仅仅提供爬取思路,实际爬取中请根据实际需要修改爬取的代码。
每个网页的架构不同,所需要书写的爬虫代码几乎不会完全相同。上文的代码仅仅只是简单的举例子。实际中如果需要爬虫,需要对网页进行分析后才能完成爬虫的工作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值