第一个爬虫
怎样扒网页呢? 其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS、CSS。如果把网页比作一个人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。所以最重要的部分是存在于HTML。
-
HTML 70%
-
JS 20%
-
CSS 10%
爬取页面,代码如下:
from urllib.request import urlopen
#请求的地址
url = 'http://www.baidu.com/'
#发送请求
resp = urlopen(url)
#打印响应结果
print(resp.read())
输出结果:
注意: urllib模块库是python自带的。在Python2叫urllib2
urllib的基本使用
requset.urlopen(url,data,timeout)
第一个参数url即为URL,是必须要传送的。第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。第二三个参数是可以不传送的,data默认为空None,timeout默认为
socket._GLOBAL_DEFAULT_TIMEOUT
response.read()
read()方法就是读取文件里的全部内容,返回bytes类型
response.getcode()
返回 HTTP的响应码,成功返回200,4服务器页面出错,5服务器问题
response.geturl()
返回 返回实际数据的实际URL,防止重定向问题 response.info() 返回 服务器响应的HTTP报头
爬取页面,代码如下:
from urllib.request import urlopen
url = 'http://www.baidu.com/'
resp = urlopen(url) # 发送请求,并将结果返回给resp
print(resp.read()) # 读取数据
print(resp.getcode()) # 为了判断是否要处理请求的结果
print(resp.geturl()) # 为了记录访问记录,避免2次访问,导致出现重复数据
print(resp.info()) # 响应头的信息,取到里面有用的数据
输出结果:
Request对象的使用
使用urllib.request.urlopen发送请求时,可以将参数封装到一个 Request对象中。 参数包含:
-
url 发送的请求链接
-
headers 请求头信息
-
data 请求数据
比如:我们可以这么改写
from urllib.request import Request,urlopen
url = 'http://www.baidu.com/'
#创建Request
req = Request(url)
#发送请求
resp = urlopen(req)
#打印结果
print(resp.read().decode()[:100])
运行结果和直接传递URL完全一样的,只不过中间多了一个request对象,推荐大家这么写,因为在构建请求时还需要加入好多内容,通过构建一个request,服务器响应请求得到应答,这样显得逻辑上清晰明确
from urllib.request import urlopen
from urllib.request import Request
url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
request = Request(url, headers=headers)
response = urlopen(request)
page = response.read()
发送请求/响应header头的含义:
名称 | 含义 |
---|---|
Accept | 告诉服务器,客户端支持的数据类型 |
Accept-Charset | 告诉服务器,客户端采用的编码 |
Accept-Encoding | 告诉服务器,客户机支持的数据压缩格式 |
Accept-Language | 告诉服务器,客户机的语言环境 |
Host | 客户机通过这个头告诉服务器,想访问的主机名 |
If-Modified-Since | 客户机通过这个头告诉服务器,资源的缓存时间 |
Referer | 客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用 于防盗链) |
User-Agent | 客户机通过这个头告诉服务器,客户机的软件环境 |
Cookie | 客户机通过这个头告诉服务器,可以向服务器带数据 |
Refresh | 服务器通过这个头,告诉浏览器隔多长时间刷新一次 |
Content-Type | 服务器通过这个头,回送数据的类型 |
Content-Language | 服务器通过这个头,告诉服务器的语言环境 |
Server | 服务器通过这个头,告诉浏览器服务器的类型 |
Content-Encoding | 服务器通过这个头,告诉浏览器数据采用的压缩格式 |
Content-Length | 服务器通过这个头,告诉浏览器回送数据的长度 |
后续.......