- HTTP与HTTPS:互联网上应用最为广泛的一种网络协议。目前所有网站开发都基于该协议,也是网站的实现原理。
- 请求头:基于HTTP与HTTPS协议实现,其作用是在通信之间实现信息传递。熟知各种请求类型,对爬虫中编写请求头有指导性作用。
- Cookies:存储用户主机浏览器中的文本文件,主要让服务器识别各个用户身份信息。
- HTML:服务器返回的网页内容,一般由服务器后台生成。网站大部分数据来源于此,熟悉HTML布局和各个标签的作用,有利于数据抓取和清洗。
- JavaScript:主要实现网页的动态功能及用户交互。要懂得分析JavaScript代码、尤其思数据加密处理。
- JSON:表示一个JavaScript对象的信息,本质是一个特殊的字符串。
- Ajax:主要是前段数据加载和渲染技术,其影响内容大部分以JSON格式为主。
简单总结储分析网站的步骤如下:
- 找出数据来源,大部分数据来源于Doc、XHR和JS标签。
- 找到数据所在的请求,分析其请求链接、请求方式和请求参数,
- 查找并确定请求参数来源。有时候某些请求参数是通过另外的请求生成的,比如请求A的参数ID是通过请求B所生成的,那么要请求A的数据,就要先获取请求B的数据作为A的请求参数。
爬虫库Urllib
爬虫库Urllib是Python自带,用于爬虫开发。
- 复杂的请求
urllib.request.Request 的语法如下:
urllib.request.Request(url,data = None,headers{},method = None)
import urllib
url = 'https://www.youku.com/'
# 自定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': 'https://www.youku.com/',
'Connection': 'keep-alive'}
# 设置request的请求头
rep = urllib.request.Request(url, headers = headers)
# 使用urlopen打开rep
html = urllib.request.urlopen(rep).read().decode('utf-8')
# 写入文件
f = open('html1.txt','w', encoding = 'utf8')
f.write(html)
f.close()
- 代理IP
代理IP的原理:以本机先访问代理IP,再通过代理IP地址访问互联网,这样网站(服务器)接收到的访问IP就是代理IP地址。(下面代理IP有问题)
import urllib.request
url = 'https://www.youku.com/'
# 设置代理IP
proxy_handler = urllib.request.ProxyHandler({
'http': '218.56.132.158:8080',
'https': '183.30.197.29: 9797'})
# 必须使用build_opener()函数来创建带有代理IP功能的opener对象
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url)
html = response.read().decode('utf-8')
f = open('html2.txt','w', encoding = 'utf-8')
f.write(html)
f.close()
- 使用Cookies
Cookie主要用于获取用户登录信息,比如,通过提交数据实现用户登录之后,会生成带有登录状态的Cookies,这时可以将Cookies保存在本地文件中,下次程序运行的时候,可以直接读取Cookies文件来实现用户登录。
import urllib.request
from http import cookiejar
filename = 'cookie.txt'
# MozillaCookieJar保存cookie
cookie = cookiejar.MozillaCookieJar(filename)
# HTTPCookieProcessoe创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
# 创建自定义opener
opener = urllib.request.build_opener(handler)
# open方法代开网页
response = opener.open('https://www.youku.com/')
# 保存cookie文件
cookie.save()
# 读取Cookies
import urllib.request
from http import cookiejar
filename = 'cookie.txt'
# 创建MozillaCookieJar对象
cookie = cookiejar.MozillaCookieJar()
# 读取cookie内容到变量
cookie.load(filename)
# HTTPCookieProcessor创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
# 创建opener
opener = urllib.request.build_opener(handler)
# opener打开网页
response = opener.open('https://www.youku.com/')
# 输出结果
print(cookie)
注意,为了方便测试,上述代码中使用的cookie.save()和cookie.load(filename)将Cookies内容显示在文本文档中。在实际开发中,为了提供安全性,可以在保存和读取Cookies时设置参数,使Cookie信息隐藏在文件中。方法如下:
cookie.save(ignore_discard = True,ignore_expires = True)
cookie.load(filename,ignore_discard = True, ignore_expires = True)
- 证书验证不作说明
- 数据处理
import urllib.request
import urllib.parse
url = 'https://17roco.qq.com/'
data = {
'value': 'true',
}
# 数据处理
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.urlopen(url,data = data)
代码中urllib,parse.urlencode(data)将数据转换成字节的数据类型,而encode('utf-8')设置字节的编码格式。这里需要注意的是编码格式。这里需要注意的是,编码格式主要是根据网站的编码格式来决定。urlencode()的作用只是对请求参数做数据格式转化处理。
除此之外,urllib还提供quote()和unquote()对URL编码处理,使用方法如下:
import urllib.parse
url = '%2523%25E7%25BC%2596%25E7%25A8%258B%2523'
# 第一次解码
first = urllib.parse.unquote(url)
print(first)
# 第二次解码
second = urllib.parse.unquote(first)
print(second)