热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用python语言编写网络爬虫

本文主要用到python3自带的urllib模块编写轻量级的简单爬虫。至于怎么定位一个网页中具体元素的url可自行百度火狐浏览器的firebug插件或者谷歌浏览器的自带方法。

 

         本文主要用到python3自带的urllib模块编写轻量级的简单爬虫。至于怎么定位一个网页中具体元素的url可自行百度火狐浏览器的firebug插件或者谷歌浏览器的自带方法。

1、访问一个网址

re=urllib.request.urlopen(\'网址‘)

打开的也可以是个urllib.request.Request对象,后边也可以跟数据参数,当有传入数据时会自动变为POST请求;

 

2、urllib.request.Request(url,data=None,headers={})对象属性和方法

 1     full_url
 2     type
 3     host
 4     data
 5     selector
 6     method    
 7     get_method()
 8     add_header(key,val)
 9     add_unredirected_header(key,header)
10     has_header(header)
11     remove_header(header)
12     get_full_url(header)
13     set_proxy(host,type)
14     get_header(header_name,default=None)
15   header_items()   

 

3、已连接对象的可用方法:

1 re.read()             读取内容,想要将内容保存下来,需先新建一个相应格式的文件,再将读取到的内容写入到这个文件内即可;
2 re.geturl()            可取得已打开对象的url地址;
3 re.info()             可取得响应服务器的信息;
4 re.getcode()           可取得响应状态码;
5 urllib.parse.urlencode()  将一个存储post数据的字典转换成打开网页所需要的数据格式;

可用json.loads()将文本转换成键值对

可在传地址时将header以一个字典数据的形式传入,以隐藏自己的访问方式;也可用re.add_header(\'\')    的方式进行追加;

 

4、当知道一个文件的url时可用此方法直接下载保存到本地

urllib.request.urlretrieve(\'http://wx1.sinaimg.cn/mw600/9bbc284bgy1ffkuafn4xtj20dw0jgh08.jpg\',\'bc.jpg\')

 

5、登录功能的实现(post)

(1)利用session保留登录状态

1 login_data = {
2             \'_xsrf\': getXSRF(baseurl),
3             \'password\': password,
4             \'remember_me\': \'true\',
5             \'email\': email,
6 session = requests.session()
7 cOntent= session.post(url, headers = headers_base, data = login_data)
8 s = session.get("http://www.zhihu.com", verify = False)
9 print s.text.encode(\'utf-8\')

(2)利用COOKIE进行登录

 1 post = {
 2             \'ua\':self.ua,
 3             \'TPL_checkcode\':\'\',
 4             \'CtrlVersion\': \'1,0,0,7\',
 5             \'TPL_password\':\'\',
 6 }
 7 #将POST的数据进行编码转换
 8 postData = urllib.urlencode(post)
 9 COOKIE = COOKIElib.LWPCOOKIEJar()
10 COOKIEHandler = urllib2.HTTPCOOKIEProcessor(COOKIE)
11 opener = urllib2.build_opener(COOKIEHandler, urllib2.HTTPHandler)
12 #第一次登录获取验证码尝试,构建request
13 request = urllib2.Request(loginURL,postData,loginHeaders)
14 #得到第一次登录尝试的相应
15 respOnse= self.opener.open(request)
16 #获取其中的内容
17 cOntent= response.read().decode(\'gbk\')
18  

网站常用的编码方式有utf8,gbk,gb2132,gb18030等

 

6、代理的使用

同一个Ip设备在短时间内访问一个服务器次数过多会被服务器禁止访问,所以很多时候我们都需要用天代理来帮助我们解决这个问题。方法如下:

1 proxy_support = urllib.request.ProxyHandler({类型:代理ip和端口号})
2 opner = urllib.request.build_opener(proxy_suppoert)
3 urllib.request.install_opener(opener)  #可选安装
4 opener.open(url)        #或直接调用opener代理

 

注:如想实现更复杂的可使用更全面的scrapy框架。

 

附:自己写的一个验证网上代理的有效性的爬虫,此爬虫先从网站上获取代理的地址,然后使用这个代理来访问百度,验证是否能得到百度的网页,如能则将此代理地址保存。

 1 import threading,time,pickle,re
 2 import urllib.request
 3 
 4 class ProxyCheck(threading.Thread):
 5     def __init__(self,proxylist):
 6         threading.Thread.__init__(self)
 7         self.proxylist = proxylist
 8         self.timeout = 5
 9         self.test_url = \'http://www.baidu.com\'
10         self.test_str = \'11000002000001\'
11         self.checkedProxyList = []
12 
13     def checkProxy(self):
14         COOKIEs = urllib.request.HTTPCOOKIEProcessor()
15         for proxy in self.proxylist:
16             proxy_handler = urllib.request.ProxyHandler({\'http\':r\'%s://%s:%s\' %(proxy[0],proxy[1],proxy[2])})
17             opener = urllib.request.build_opener(COOKIEs,proxy_handler)
18             opener.addheaders = [(\'User-Agent\', \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \'
19                                                 \'(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\')]
20             urllib.request.install_opener(opener)
21             t1 = time.time()
22             try:
23                 req = urllib.request.urlopen(self.test_url,timeout=self.timeout)
24                 result = req.read().decode(\'utf-8\')
25                 timeused = time.time() - t1
26                 pos = result.find(self.test_str)
27                 if pos > 1:
28                     self.checkedProxyList.append((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
29                     print((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
30                 else:
31                     continue
32             except:
33                 continue
34     # def sort(self):
35     #     sorted(self.checkedProxyList,cmp=lambda x,y:cmp(x[4],y[4]))
36     def save(self,filename):
37         with open("%s.txt"%filename,\'w\') as f:
38             for proxy in self.checkedProxyList:
39                 f.write("{}\t{}:{}\t{}\t{}\n".format(*proxy))
40         with open("%s.pickle"%filename,\'wb\') as fb:
41             pickle.dump(self.checkedProxyList,fb)
42 
43     def run(self):
44         self.checkProxy()
45         self.save("checked-50")
46 
47 
48 class xiciProxy:
49     def __init__(self):
50         self.alllist = []
51     def grep(self,url):
52         # req = urllib.request.Request(url)
53         # req.add_header(\'User-Agent\', \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \'
54         #                             \'(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\')
55 
56 
57         result1 = urllib.request.urlopen(req)
58         result2 = result1.read().decode(\'utf-8\')
59 
60         regex = r"(\d+.\d+.\d+.\d+)\n.*?" \
61                 r"(\d+)\n.*?" \
62                 r"\n.*?" \
63                 r"(.*?)\n.*?" \
64                 r"\n.*?" \
65                 r"\n.*?" \
66                 r"(HTTPS?)"
67         get = re.findall(regex,result2)
68         proxylist = []
69         for i in get:
70             proxylist.append((i[3],i[0],i[1],i[2]))
71         return proxylist
72     def save(self,filename):
73         with open("%s.txt"%filename,\'w\') as f:
74             for proxy in self.alllist:
75                 f.write("{}\t{}:{}\t{}\n".format(*proxy))
76         with open("%s.pickle"%filename,\'wb\') as fb:
77             pickle.dump(self.alllist,fb)
78     def run(self):
79         for i in range(51,1951):
80             url = "http://www.xicidaili.com/nn/{}".format(i)
81             print(url)
82             proxylist = self.grep(url)
83             self.alllist += proxylist
84             if i % 50 == 0:
85                 self.save("xiciproxy-{}".format(i))
86                 self.alllist = []
87 
88 with open("xiciproxy-50.pickle","rb") as fb:
89     proxylist = pickle.load(fb)
90 ProxyCheck(proxylist).run()
View Code

 


推荐阅读
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
author-avatar
丁可丁可_136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有