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模拟登陆。首先我们需要分析目标网站的登陆流程,不同的网站可能流程不一样。

  以下是知乎的登陆流程:

  1.   技术分享

  使用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)

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。