爬虫原理
网络连接
简单来说,计算机一次request请求和服务器端的response回应,即实现了网络连接。
返回响应信息的类型:
爬虫原理
网络连接需要计算机一次request请求和服务器端的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()方法解析《斗破苍穹》第一章的文本内容。
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/等,看看能得返回什么代号,并上网查找该代号的含义。
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试