数据采集——爬虫实战

爬虫原理

网络连接
简单来说,计算机一次request请求和服务器端的response回应,即实现了网络连接。
在这里插入图片描述
返回响应信息的类型:
返回响应消息
爬虫原理

网络连接需要计算机一次request请求和服务器端的response回应。爬虫也是需要做两件事:

  1. 模拟计算机对服务器发起request请求。
  2. 接收服务器端的response内容并解析、提取所需信息。



爬虫体验:爬取北京天气信息

使用云服务来获取信息

请同学们复制下面的代码到idle中并运行

import requests
url = 'https://api.seniverse.com/v3/weather/daily.json?key=8eb3luvplbmdykzh&location=beijing&language=zh-Hans&unit=c&start=0&days=5'
r =requests.get(url)
tomorrow = r.json()['results'][0]['daily'][1]
print("北京明天的最高气温是",tomorrow['high'],"摄氏度"," 最低气温是",tomorrow['low']," 摄氏度。")
  • requests库是第三方库,用于访问网站并获取网页相关信息
  • url是指统一资源定位系统,可以理解为网址
  • API是"应用编程接口"的缩写。通过 API,就算你不知道如何操作,也能将你的产品或服务与其他的互通。这样可以简化应用的开发,节省时间和成本。
  • JSON是一种与开发语言无关的、轻量级的数据存储格式,全称JavaScript Object Notation,一种数据格式的标准规范

将上段代码的json数据输出,如下所示:
在这里插入图片描述

直接看json代码有点乱,可以使用json解析器
https://www.sojson.com/
在这里插入图片描述

任务1
尝试修改代码,输出风的方向风的级别

提示:列表和字典的用法

  • 列表的格式:list=[value1,value2,value3]
  • 列表数据的获取:通过索引值获取,如获取第一个元素list[0]
  • 字典的格式:d = {key1 : value1, key2 : value2 }
  • 字典数据的获取:通过key来获取value,如d[key1]的值为value



爬虫实例:获取《斗破苍穹》小说全文

爬虫的一般过程为:
准备链接——获取数据——解析数据——保存数据


1.准备链接:

今天我们需要准备的网址是:
http://www.doupoxs.com/doupocangqiong/1.html

我们需要爬取小说第一章的内容


2.获取数据:

  • 根据上个案例代码可知,用requests.get()方法就可以获取网页上所有的信息。
  • 我们将获取的数据存储在res变量里,print(res.text)就能获得数据。
import requests
url ="http://www.doupoxs.com/doupocangqiong/1.html"
res = requests.get(url)
res.encoding = 'utf-8'
print(res.text)

复制代码,看能否输出网页信息


3.解析数据:

(1)网页构造
打开一个网页,右击空白处,在弹出的快捷菜单中选择“检查”命令,可以看见网页的代码。(或者按下键盘F12)
在这里插入图片描述
(2)查询网页信息
点击代码左上方箭头图标,再将鼠标光标移至网页上想要查询的信息的位置,右侧代码区会显示该元素在网页代码中的具体位置。
在这里插入图片描述
(3)定位信息
通过手动查找的方式,发现我们需要的文字信息全部在’<.p>…<./p >'之间
在这里插入图片描述
(4)re.findall()方法抓取信息

如何利用程序自动抓取信息呢?这里需要告诉程序我们要抓取的信息有什么特点。从上文分析可知,需要的文字信息全部在’<.p>…<./p >之间。
可以用正则表达式来抓取信息。

下段代码是用“贪心算法”,从字符串中找到指定子字符并输出

  • (.*?)为通用匹配符,在re.findall()方法中替换目标字符
##例子
import re
a="<h1>第一章 陨落的天才</h1>"
text=re.findall('<h1>(.*?)</h1>',a,re.S)
#第一部分是规则,第二部分是需要匹配的文本,第三部分是匹配所有的字符
print(text)
['第一章 陨落的天才']
>>> 

正则表达式的符号很多,有兴趣的同学可以深入学习,可参考下面链接
https://www.runoob.com/regexp/regexp-syntax.html

尝试着用re.findall()方法解析《斗破苍穹》第一章的文本内容。

  1. 获取小说第一章的URL链接
  2. 通过前面介绍的requests.get()方法,获取网页上所有的信息
  3. 用贪心算法re.findall()方法准确找到文本内容
  4. 输出文本内容
import requests
import re
url ="http://www.doupoxs.com/doupocangqiong/1.html"
res = requests.get(url)
text=re.findall('<p>(.*?)</p>',res.content.decode('utf-8'),re.S)
print(text)



扩展内容:

1.获取《斗破苍穹》整本小说的文字信息
上文的代码只获取了一个网页的信息。
为了爬取所有章节的信息,通过手动浏览,以下为前五章的网址:

http://www.doupoxs.com/doupocangqiong/1.html
http://www.doupoxs.com/doupocangqiong/2.html
http://www.doupoxs.com/doupocangqiong/3.html
http://www.doupoxs.com/doupocangqiong/4.html
http://www.doupoxs.com/doupocangqiong/5.html

可以看出,每章节的URL有明显的规律,通过数字递加来分页。可以通过循环语句来构造URL列表。
这里我们可以使用format()方法。

  • format()方法是将字符串进行格式化,就像做了选择题,留了空给做题者选择。
a='{} is my love'.format('python')
print(a)
python is my love
>>> 

观察每个页面的URL可以发现,只有尾部的数字不一样,且十分有规律,从1开始递加,因此可以使用for…range()来构造列表。

url =["http://www.doupoxs.com/doupocangqiong/{}.html".format(str(i)) for i in range(2,1647)]
print(url)

复制上段代码看能否输出所有的网页URL

上文通过re.findall()获得页面的所有文本信息。要获得整本书的信息,可以设置一个循环,依次爬取每一页的信息。

扩展任务1:
尝试着获取整本小说的文本信息。


2.将文字信息写入记事本文档中

f=open('E:\doupo.txt','a+')

在代码最开始的部分新建一个TXT文档

扩展任务1中获取的文本内容均存储在text中,用for循环语句逐字写入记事本中

for content in text:
     f.write(content+'\n')

最后关闭文档

f.close()

扩展任务2:
请将上述代码合并整理成完整的代码,使之能生成包含《斗破苍穹》全文的一个TXT文件


小彩蛋

import requests
url ="http://www.doupoxs.com/doupocangqiong/1.html"
res = requests.get(url)
print(res)

输入以上代码,得到以下结果

<Response [200]>
  • [200]为网页正常的代号

输入其他网址,例如https://movie.douban.com/等,看看能得返回什么代号,并上网查找该代号的含义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值