模式修改符:
I:忽略大小写
M:多行匹配
U:unicode编码
L:本地化匹配
S:点任意匹配模式,改变’.’的行为
利用正则表达式对豆瓣出版社信息的提取:
import re
import urllib.request
url='https://read.douban.com/provider/all'
data=urllib.request.urlopen(url).read().decode('utf-8',"ignore")
pat= '<div class="name">(.*?)</div>'
res=re.compile(pat).findall(data)
print(res)
存入文件
file=open('reout.txt','w',encoding='utf-8')
for i in range(0,len(data)):
file.write(data[i]+"\n")
file.close()
模仿http的get请求
import urllib.request
keywd='啦啦'
keywd=urllib.request.quote(keywd)
url="http://www.baidu.com/s?wd="+keywd
req=urllib.request.Request(url)
data=urllib.request.urlopen(req).read()
fh=open("request2.html",'wb')
fh.write(data)
fh.close()
模仿post请求:
import urllib.request
import urllib.parse
url=“登录页面链接”
mydata=urllib.parse.urlencode({"name":"",password=""}).encode("utf-8")
req=urllib.request.Request(url,mydata)
data=urllib.request.urlopen((req).read())
异常处理
1.常见状态码:
两个异常处理类:HTTPError是URLError的子类,前者有状态码和异常原因。
URLError:连不到服务器、无网络、url不存在,触发了httperror子类
伪装成爬虫浏览器
如果试着爬去csdn博客,会返回403,因为对方服务器对爬虫进行了屏蔽。此时需要伪装成浏览器,添加header报头才能爬取
爬取csdn首页所有文章
url="http://blog.csdn.net/"
headers=("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
opener.addheaders=[headers]
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
pat='<h3 class="tracking-ad" data-mod="popu_254"><a href="(.*?)"'
result=re.compile(pat).findall(data)
for i in range(0,len(result)):
file="csdn/"+str(i)+".html"
urllib.request.urlretrieve(result[i],filename=file)
print("第"+str(i+1)+"次爬取成功")
使用代理服务器
import urllib.request
def use_proxy(url,proxy_addr):
proxy=urllib.request.ProxyHandler({"http":proxy_addr})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
return data
proxy_addr="119.183.220.224:8888"
url="http://www.baidu.com"
data=use_proxy(url,proxy_addr)
print(len(data))