修改报头
1.使用build_opener()修改报头:
headers = ("User-Agent", #定义变量headers存储User-Agent信息
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
opener = urllib.request.build_opener() #创建opener对象并赋给变量
openeropener.addheaders = [headers] #设置opener的addheaders
data = opener.open(url).read() #使用opener对象的open()方法打开网址
2.使用add_header()添加报头
req = urllib.request.Request(url) #创建Request对象
req.add_header("User-Agent", #使用add_header()方法添加header信息
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
data = urllib.request.urlopen(req).read() #使用urlopen打开该Request对象即可打开对应网址
超时设置(timeout)
格式:urllib.request.urlopen("http://yum.iqianyue.com", timeout=1)
Get请求
Keywd=”hello”
url=http://baidu.com/s?wd=+keywd
req=urllib.request.Request(url) #创建Request对象
data=urllib.request.urlopen(req).read()#使用urlopen打开该Request对象即可打开对应网址
注意:当有中文是需进行重新编码
Key_wd=urllib.request.quote(keywd)
Post请求
postdata = urllib.parse.urlencode({ #关键知识点:将数据使用urlencode编码
"name": "liweiguotest", "pass": "123456"}).encode('utf-8') #使用encode设置为utf-8编码
req = urllib.request.Request(url, postdata)req.add_header("User-Agent",
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
代理服务器设置
def use_proxy(proxy_addr, url): #使用代理服务器爬去取网页(函数)
import urllib.request
proxy = urllib.request.ProxyHandler({'http': proxy_addr}) #设置对应的代理服务器信息
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler) #创建一个自定义 opener对象
urllib.request.install_opener(opener) #创建全局默认的opener对象,所以下面可以直接打开网址
data = urllib.request.urlopen(url).read() #.decode('utf-8') return dataproxy_
addr = "60.255.186.169:8888"
data = use_proxy(proxy_addr, "http://www.liweiguo.daxueyuan.top")
正则表达式基础
1.原子:正则表达式中最基本的组成单位
普通字符做原子 | (“a”,”b”) |
非打印字符做原子 | (“\n”,”\t”) |
通用字符做原子: | \w:匹配任意一个字母,数字或下划线 |
\W:匹配除上述之外的任意字符 | |
\d:匹配任意一个十进制数 | |
\D: 匹配除十进制数之外的任意字符 | |
\s:匹配任意一个空白字符 | |
\S:匹配除空白字符之外的任意字符 | |
原子表:定义一组原子,匹配的时候表中的各原子逐一进行匹配 |
2.元字符:正则表达式具有一些特殊含义的字符
. | 匹配除换行符以外的任意字符 |
ˆ | 匹配字符串开始的位置 |
$ | 匹配字符串结束的位置 |
* | 匹配0次或多次前面的原子 |
? | 匹配0次或1次前面的字符 |
+ | 匹配1次或多次前面的字符 |
{n} | 前面的字符恰好出现n次 (字符可以是通用字符) |
{n,} | 前面的原子至少出现n次 |
{n,m} | 前面的原子至少出现n次至多出现m次 |
| | 选择模式符 |
() | 模式单元符 :在不改变正则表达式的情况下改变其含义,从而实现匹配结果的调整。 |
正则表达式常见函数
re.match() | 从字符串开始匹配一个模式 |
格式:re.match(pattern,string,flag) #flag为可选参数,可以放模式修正符等 | |
re.search() | 在全文进行检索并匹配 |
全局匹配函数 | 将符合模式的式子全部找出 |
格式:Result = re.compile(pattern).findall(string) | |
re.sub() | 根据正则表达式实现替换某些字符串 |
格式:re.sub(pattern,rep,string,max) Rep:要替换成的字符串 Max:可选参数,代表最多替换的次数。如果不写,则会将符合模式的结果全部替换 |
模拟登录
1.使用post模拟登录并保存cookie
postdata = urllib.parse.urlencode({ # 通过post请求登录
"yhm": "04170819",
"mm": "1997719liweil..."}).encode('utf-8')
req = urllib.request.Request(url, postdata) # 构建对象
req.add_header("User-Agent", # 添加表头
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
cjar = http.cookiejar.CookieJar() # 创建cookiejar对象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) # 使用HTTPCookieProcessor创建cookie处理器,并以其为参数构建opener处理器
urllib.request.install_opener(opener) # 将opener设为全局
file = opener.open(req)data = file.read() # 请求信息并读取
fhandle = open("C:\\Users\\john\\Desktop\\summer\\crawler\\HTMLfile\\cookiejar_test.html", 'wb')
fhandle.write(data)fhandle.close()
2.使用已知cookie模拟登陆
request_header = {
"Accept": '*/*',
"Accept-Language": "en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3",
'Host': 'jw.jluzh.com',
"Connection": "Keep-Alive",
"Cookie": cookie_str,
"User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134"}
req = urllib.request.Request(url, headers=request_header)
resp = urllib.request.urlopen(req)
data = resp.read() #.decode('utf-8')