理解爬虫原理
作业要求来自于https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2851
一、简单说明爬虫原理
通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用。
二、理解爬虫开发过程
1.简要说明浏览器工作原理:
浏览器工作原理的实质就是实现http协议的通讯,具体过程如下:
HTTP通信的流程,大体分为三个阶段:
(1)连接:服务器通过一个ServerSocket类对象对8000端口进行监听,监听到之后建立连接,打开一个socket虚拟文件。
(2)请求:创建与建立socket连接相关的流对象后,浏览器获取请求,为GET请求,则从请求信息中获取所访问的HTML文件名,向服务器发送请求。
(3)应答:服务收到请求后,搜索相关目录文件,若不存在,返回错误信息;若存在,则将html文件进行加HTTP头等处理后响应给浏览器,浏览器解析html文件,若其中还包含图片,视频等请求,则浏览器再次访问web服务器,异常获取图片视频等,并对其进行组装显示出来。
2.使用 requests 库抓取网站数据:
代码如下:
1 import requests 2 url='http://www.chinaedu.edu.cn/' 3 #网络资源获取 4 res=requests.get(url) 5 res.encoding = 'utf-8' 6 print(res.text)
运行截图:
3.了解网页
写一个简单的html文件,包含多个标签,类,id
代码如下:
1 <body> 2 <div id="wrapper"> 3 <header id="header"> 4 <div class="content"> 5 <div class="inner"> 6 <h1>这是一个头部标签</h1> 7 <p>然后是P标签里面有a标签,也就是点击以后会跳转到一个链接 <a href="https://www.sina.com.cn/"><br>跳转到新浪网</a> 里面<br> </p> 8 </div> 9 </div> 10 <nav class="use-middle"> 11 <ul> 12 <li><a id="intro">第一</a></li> 13 <li><a id="work">第二</a></li> 14 <li><a id="about">第三</a></li> 15 <li><a id="contact">第四</a></li> 16 </ul> 17 </nav> 18 </header> 19 </div> 20 </body>
运行截图:
4.使用 Beautiful Soup 解析网页:
通过BeautifulSoup(html_sample,'html.parser')把上述html文件解析成DOM Tree
select(选择器)定位数据
找出含有特定标签的html元素
找出含有特定类名的html元素
找出含有特定id名的html元素
代码如下:
1 from bs4 import BeautifulSoup 2 with open(r'test.html','r',encoding='utf-8') as f: 3 text=f.read() 4 soup=BeautifulSoup(text,'html.parser') 5 #特定标签的html元素 6 a=soup.select('li')[2].text 7 # 特定类名的html元素 8 b=soup.select('.inner')[0].text 9 # 特定id名的html元素 10 c=soup.select('#intro')[0].text 11 print(a,b,c)
运行截图:
三、提取一篇校园新闻的标题、发布时间、发布单位
url = 'http://news.gzcc.cn/html/2019/xiaoyuanxinwen_0320/11029.html'
代码如下:
1 import requests 2 from bs4 import BeautifulSoup 3 url='http://news.gzcc.cn/html/2019/xiaoyuanxinwen_0320/11029.html' 4 res = requests.get(url) 5 res.encoding = 'utf-8' 6 res.text 7 soup = BeautifulSoup(res.text,'html.parser') 8 title = soup.select('.show-title')[0].text 9 info = soup.select('.show-info')[0].text 10 list = info.split() 11 del list[-1] 12 for i in list: 13 print(i)
运行截图: