Python爬虫(2)
之前尝试着去抓取某个网站的帖子中资源的地址,由于次数太多网站暂时封了IP。所以我们现在需要尝试着使用代理proxy,不过在这之前我们要了解opener和handler。
我们使用opener打开url,而opener实际是使用handler进行处理。所以我们一般先创建一个handler,在使用build_opener一个opener,之后就可以使用这个opener打开url,或者使用install_opener安装opener。下面就是一个简单的例子:
1 import re 2 import urllib.request 3 4 5 def Spider(url): 6 proxy = urllib.request.ProxyHandler({‘http‘:‘IP:PORT‘}) 7 opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler) 8 urllib.request.install_opener(opener) 9 req = urllib.request.Request(url, headers = { 10 "Connection": "Keep-Alive", 11 "Accept": "text/html, application/xhtml+xml, */*", 12 "Accept-Language": "en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3", 13 "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"}) 14 page=urllib.request.urlopen(req).read().decode("UTF-8") 15 pat=‘(http://pan\.baidu\.com/s/[\da-zA-Z]{6,8})‘ 16 s=re.findall(pat,page) 17 pat_=‘(密码(.?)(\s)?([\da-zA-Z]{4}))‘ 18 s_=re.findall(pat_,page) 19 if s: 20 if s_: 21 print(s[0]) 22 print(s_[0][0]) 23 else: 24 print("提取码没有抓到") 25 else: 26 print("提取网址没有抓到") 27 28 if __name__ =="__main__": 29 url="网址" 30 Spider(url)
除了使用代理,我们还可以通过cookie handler模拟登陆。首先我们需要分析目标网站的登陆流程,不同的网站可能流程不一样。
以下是知乎的登陆流程:
使用HTTPfox检测一次登陆流程,我们可以发现上面有一条post指令,在看看发送的内容:
毫无疑问,我们已经知道了如何登陆了,现在只需要获得前面一串_xsrf字符串了,而这个我们查看一下首页源代码就轻易地找到了。下面就可以使用cookie登陆知乎了。
1 import urllib.request 2 import http.cookiejar 3 import gzip 4 import re 5 6 def Get_xsrf(html): 7 pat=‘name="_xsrf"\svalue="(.*?)"/>‘ 8 s=re.findall(pat,html) 9 return s[0] 10 11 12 def Degzip(page): 13 try: 14 print("正在解压.....") 15 html= gzip.decompress(page) 16 print("解压完毕!") 17 except: 18 print("无需解压") 19 return html 20 21 def Getopener(): 22 cj=http.cookiejar.CookieJar() 23 cookie=urllib.request.HTTPCookieProcessor(cj) 24 opener=urllib.request.build_opener(cookie) 25 header=[] 26 head= { 27 ‘Connection‘: ‘Keep-Alive‘, 28 ‘Accept‘: ‘text/html, application/xhtml+xml, */*‘, 29 ‘Accept-Language‘: ‘en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3‘, 30 ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko‘, 31 ‘Accept-Encoding‘: ‘gzip, deflate‘, 32 ‘Host‘: ‘www.zhihu.com‘, 33 ‘DNT‘: ‘1‘} 34 for key, value in head.items(): 35 elem = (key, value) 36 header.append(elem) 37 opener.addheaders = header 38 return opener 39 40 41 def Spider(url): 42 opener=Getopener() 43 data=opener.open(url).read() 44 html=Degzip(data).decode("UTF-8") 45 xsrf=Get_xsrf(html) 46 47 url+="login" 48 ID="账号" 49 PASSWORD="密码" 50 postDict = { 51 ‘_xsrf‘:xsrf, 52 ‘email‘: ID, 53 ‘password‘: PASSWORD, 54 ‘rememberme‘: ‘y‘} 55 postData=urllib.parse.urlencode(postDict).encode("UTF-8") 56 data=opener.open(url,postData).read() 57 html=Degzip(data).decode("UTF-8") 58 59 pat=‘<span class="name">(.*?)</span>‘ 60 s=re.findall(pat,html) 61 print(s[0]) 62 63 64 if __name__=="__main__": 65 url = ‘http://www.zhihu.com/‘ 66 Spider(url)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。