Python学习
第二十六天
爬虫学习(一)
1、认识网页
网页一般由三部分组成,分别是 HTML(超文本标记语言)、CSS(层叠样式表)和 JavaScript(活动脚本语言)。
1、HTML
HTML 是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且绝大多数的标签都是成对出现的。
<html>..</html> 表示根标记其实可以说内部元素就是网页内容
<body>..</body> 表示用户页面可见的内容
<div>..</div> 表示框架
<p>..</p> 表示段落
<img>..</img>表示图片
<h1>..</h1>表示标题
<a href="">..</a>表示超链接
2、CSS
CSS 表示样式,在 CSS 中定义了外观,我们可以说在HTML中定义了页面的内容,而CSS就是给我们页面的内容化妆美化的,让页面显得好看。
3、JavaScript
JavaScript表示功能。交互的内容和各种特效都在 JavaScript中,JavaScript描述了网站中的各种功能。
4、一个简单的网页
<html>
<head>
<title> 网页标题</title>
</head>
<body>
<div>
<p>段落标签</p>
</div>
<div>
<ul>
<li><a href="http:/www.baidu.com">百度</a></li>
</ul>
</div>
</body>
2、认识爬虫
简单来说,爬虫就是一段自动抓取互联网信息的程序。互联网其实由一个个的url相互关联起来的,而我们的爬虫就是从url出发,爬取我们需要的价值数据。
互联网.png
简单来说,爬虫就是爬取互联网数据,为我所用。
3、爬虫常见概念
3.1、url管理器
url管理器就是用来管理抓取URL集合和已经抓取的URL集合的,用来防止重复抓取数据,进而形成死循环。
URL管理器功能:
URL管理器实现方式
1、使用内存,分别对待爬取URL集合以及已爬取URL集合创建set();
2、使用关系数据库MySQL,创建表urls(url,is_status),前者代表链接,后者代表是否已经爬取的状态;
3、使用缓存数据库,比如说Redis,同样对待爬取URL集合以及已爬取URL集合创建set,因为Redis中支持set数据;
3.2、网页下载器
网页下载器:
将互联网上URL对应的网页以HTML的形式下载到本地文件或者内存字符串的工具。
Python中两种网页下载器:
1、urllib2、Python官方的基础模块;
2、requests、第三方很强的包;
我们先来简单说说urllib2。
urllib2下载网页的方式
1、urllib2.urlopen(url)方法
python3中已经将urllib2改为urllib.request。
import urllib.request as urllib2
#直接请求
response = urllib2.urlopen('http://www.baidu.com')
#获得状态码 200即为成功
status = response.getcode()
print(status)
#读取响应内容
content = response.read()
print(content)
2、urllib2.Request对象设置
如果需要执行更复杂的操作,比如增加HTTP报头,必须创建一个 Request 实例来作为urlopen()的参数;而需要访问的url地址则作为 Request 实例的参数。
而这个Request实例除了URL参数之外,还可以设置data和headers参数:
data参数、随着URL提交的数据,默认是空值。
headers参数、字典,主要是需要发送的HTTP报头的键值对数据,比如不同的浏览器在发送请求的时候,会有不同的User-Agent,我们就可以假冒身份。
import urllib.request as urllib2
url = 'http://www.baidu.com'
data = {}
headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request = urllib2.Request(url=url,data=data,headers=headers)
#向服务端发送请求
response = urllib2.urlopen(request)
#获得响应数据
html = response.read()
print(html)
3、添加特殊场景处理器
我们在访问网页的时候,肯定会存在部分页面只有登陆情况下才可以访问、需要代理才可以访问、甚至有些网页需要HTTPS加密访问,这个时候我们就需要场景处理器了。
常见的处理器如下:
HTTPCookieProcessor、从文件中获取cookies,做为请求的一部分去访问;
ProxyHandler、部分网站会检测某一段时间某个IP的访问次数,如果访问次数多的不像正常人,它会禁止这个IP的访问。所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取;
HTTPSHandler、发送https的请求;
HTTPRedirectHandler、拦截重定并发起重新发起请求;
import urllib.request as urllib2
import random
url ="http://www.baidu.com/"
header={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}
proxy_list = [
{"http" : "IP地址1 : 端口1"},
{"http" : "IP地址2 : 端口2"},
{"http" : "IP地址3 : 端口3"},
]
# 随机选择一个代理
proxy = random.choice(proxy_list)
# 使用选择的代理构建代理处理器对象
httpproxy_handler = urllib2.ProxyHandler(proxy)
opener = urllib2.build_opener(httpproxy_handler)
request = urllib2.Request(url,headers=header)
response = opener.open(request)
print(response.read().decode('utf-8'))
3.3、网页解析器
网页解析器、其实就是从网页中获取有价值数据的工具。
python中常见的网页解析器:
1、正则表达式
2、python自带的html.parser
3、BeautifulSoup第三方模块
4、lxml模块
这四种方式中,正则表达式其实就是字符串的模糊匹配,后三者均是结构化的解析。
网页解析器如何解析,后面具体去代码实现。。。