urllib是python3中用于操作url的内置库。在python2中分为urllib和urllib2
urllib.request.urlopen(url, data, timeout)
步骤:
import urllib.request # 引入模块
res = urllib.request.urlopen('http://www.baidu.com')
data = res.read() # 读取文件内容
code = res.getcode() # 200
url = res.geturl() # www.baidu.com
上一种方法请求很容易被识别为爬虫,所以对设置了反爬虫的网页进行爬虫时,可以设置一些Headers信息,模拟为浏览器请求
方法:设置Headers信息(User-Agent)
如何找User-Agent:打开任意一个网页 -> 开发工具窗口 -> Network标签页 -> 在网页中点击任意链接 -> 点击任意请求 -> Headers标签 -> 找到User-Agent
我的User-Agent:
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER
步骤:
import urllib.request
url = 'http://www.baidu.com'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'
}
req = urllib.request.Request(url, headers=header) # 创建一个request对象
res = urllib.request.urlopen(req) # 返回爬取的网页
原因:使用同一个IP爬取同一网站上的网页,长时间后会被该网站的服务器屏蔽
解决方法:使用代理服务器(显示的不是我们真实的IP地址,而是代理服务器的IP地址)
import urllib.request
def use_proxy(proxy_address, url):
# 设置代理服务器的IP地址
proxy = urllib.request.ProxyHandler({'http': proxy_address})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
urllib.request.install_opener(opener) # 将opener安装为全局
data = urllib.request.urlopen(url)
# opener不安装为全局
#proxy = urllib.request.ProxyHandler({'http': proxy_address})
#opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
#data = opner.open(url)
return data
proxy_address = '61.163.39.70:9999'
data = use_proxy(proxy_address, 'http://www.baidu.com')
原因:网页涉及登录信息
import urllib.request
import urllib.parse
import http.cookiejar
url = 'http://xxxxxxxxx.com'
data = {
'username': '123456',
'password': '123456'
}
postdata = urllib.parse.urlencode(data).encode('utf8')
header = {'User-Agent': 'xxxxxxxxxx'}
req = urllib.request.Request(url, postdata, headers=header)
cookie = http.cookiejar.CookieJar() # 创建CookieJar对象
handler = urllib.request.HTTPCookieProcessor(cookie) # 创建cookie处理器
opener = urllib.request.build_opener(handler) # 构建opener对象
res = opener.open(req)
get请求的信息传递是通过url传递的
结构:url?key1=value1&key2=value2…
import urllib.parse
import urllib.request
# http://www.xxx.com?key1=value1&key2=value2
url = 'http://www.xxx.com?'
data = {
'key1': 'value1',
'key2': 'value2'
}
params = urllib.parse.urlencode(data) # key1=value1&key2=value2,已编码
header = {'User-Agent': 'xxxxxx'}
req = urllib.request.Request(url+params, headers=header)
res = urllib.request.urlopen(req)
post请求是通过表单传递数据的
import urllib.request
import urllib.parse
url = 'http://www.xxx.com?'
header = {'User-Agent': 'xxxxxx'}
data = {
'name': '123456',
'password': '123456'
}
postdata = urllib.parse.urlencode(data).encode('utf8')
req = urllib.request.Request(url, postdata) # 传入数据,但头信息呢?
res = urllib.request.urlopen(req)
urllib.request.urlopen():打开网页,返回类似文件对象
urllib.request.Request:生成request对象
urllib.request.ProxyHandler:设置代理服务器
urllib.request.build_opener:创建opener,返回opener对象
urllib.request.install_opener:创建全局默认opener
urllib.parse.urlencode:对字典进行编码
urllib.parse.quote:对字符串进行编码