首页 web前端 html教程 自学Python十一 Python爬虫总结_html/css_WEB-ITnose

自学Python十一 Python爬虫总结_html/css_WEB-ITnose

Jun 21, 2016 am 08:59 AM

通过几天的学习与尝试逐渐对python爬虫有了一些小小的心得,我们渐渐发现他们有很多共性,总是要去获取一系列的链接,读取网页代码,获取所需内容然后重复上面的工作,当自己运用的越来越熟练之后我们就会尝试着去总结一下爬虫的共性,试着去写个helper类以避免重复性劳动。

参考: 用python爬虫抓站的一些技巧总结 zz

1.访问网站 #最简单的得到网页代码的方法

1 import urllib22 response = urllib2.urlopen("http://www.xx.com")3 print response.read()
登录后复制

2.伪装成浏览器(User-Agent,Referer等) #为了不被服务器禁止访问所以还是伪装成浏览器比较好

1 headers = {2     'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',3     'Referer':'http://www.xx.com/xx',4     'Accept':'application/javascript, */*;q=0.8'5 }6 response = urllib2.Request(url = "http://www.xx.com",data = None,headers = headers)
登录后复制

3.Post数据转码

1 import urllib,urllib22 values = {3     'username':'xxx',4     'password':'xxx',5     'key':'xxx'6 }7 postdata = urllib.urlencode(values)8 response = urllib2.Request(url,data = postdata)
登录后复制

4.Cookies

1 import urllib2,cookielib2 cookie_handler = urllib2.HTTPCookieProcessor(cookielib.CookieJar())3 opener = urllib2.build_opener(cookie_handler)4 urllib2.install_opener(opener)5 response = urllib2.urlopen(url)
登录后复制

5.代理服务器 #重复多次访问同一网址 结果被封了ip或限制了访问次数

1 import urllib22 proxy_handler = urllib2.ProxyHandler({"http" : '42.121.6.80:8080'})3 opener = urllib2.build_opener(proxy_handler)4 urllib2.install_opener(opener)5 response = urllib2.urlopen(url)
登录后复制

问:如果想cookie和proxy一起用怎么办?

答:urllib2.build_opener可以放多个参数,即handler 如:BaseHandler,ProxyHandler,HTTPHandler,FileHandler,FTPHandler,CacheFTPHandler等等等等

6.gzip #现在普遍支持gzip压缩,我们默认获取压缩后的网页,大大提高了抓取网页的效率,减少了带宽负荷。

1 import urllib2,zlib2 req = urllib2.Request(url)3 req.add_header('Accept-encoding', 'gzip')4 response = urllib2.urlopen(req, timeout=120)5 html = response.read()6 gzipped = response.headers.get('Content-Encoding')7 if gzipped:8     html = zlib.decompress(html, 16+zlib.MAX_WBITS)
登录后复制

7.其他

设置线程栈大小:栈大小显著影响python的内存占用,方法如下:

 1 from threading import stack_size 2 stack_size(32768*16)
登录后复制

设置超时

1 import socket2 socket.setdefaulttimeout(10) #设置10秒后连接超时
登录后复制

失败后重试

 1 def get(self,req,retries=3): 2     try: 3         response = self.opener.open(req) 4         data = response.read() 5     except Exception , what: 6         print what,req 7         if retries>0: 8             return self.get(req,retries-1) 9         else:10             print 'GET Failed',req11             return ''12     return data
登录后复制

根据以上内容,我们可以写出便于配置解决重复性工作的自己的helper类:

 1 # -*- coding: utf-8 -*- 2 import cookielib, urllib, urllib2, socket 3 import zlib,StringIO 4 class HttpClient: 5   __cookie = cookielib.CookieJar() 6   #代理设置,需要时添加(后续设置为多代理切换) 7   #__proxy_handler = urllib2.ProxyHandler({"http" : '42.121.6.80:8080'}) 8   __req = urllib2.build_opener(urllib2.HTTPCookieProcessor(__cookie))#,__proxy_handler) 9   __req.addheaders = [10     ('Accept', 'application/javascript, */*;q=0.8'),11     ('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)')12   ]13   urllib2.install_opener(__req)14 15   def Get(self, url, refer=None,retries=3):16     try:17       req = urllib2.Request(url)18       req.add_header('Accept-encoding', 'gzip')19       if not (refer is None):20         req.add_header('Referer', refer)21       response = urllib2.urlopen(req, timeout=120)22       html = response.read()23       gzipped = response.headers.get('Content-Encoding')24       if gzipped:25           html = zlib.decompress(html, 16+zlib.MAX_WBITS)26       return html27     except Exception,what:28         print what29         if retries>0:30             return self.Get(url,refer,retries-1)31         else:32             print "Get Failed",url33             return ''34     #except urllib2.HTTPError, e:35     #  return e.read()36     #except socket.timeout, e:37     #  return ''38     #except socket.error, e:39     #  return ''40 41   def Post(self, url, data, refer=None):42     try:43       req = urllib2.Request(url, urllib.urlencode(data))44       #req = urllib2.Request(url,data)45       if not (refer is None):46         req.add_header('Referer', refer)47       return urllib2.urlopen(req, timeout=120).read()48     except urllib2.HTTPError, e:49       return e.read()50     except socket.timeout, e:51       return ''52     except socket.error, e:53       return ''54 55   def Download(self, url, file):56     output = open(file, 'wb')57     output.write(urllib2.urlopen(url).read())58     output.close()59 60   def getCookie(self, key):61     for c in self.__cookie:62       if c.name == key:63         return c.value64     return ''65 66   def setCookie(self, key, val, domain):67     ck = cookielib.Cookie(version=0, name=key, value=val, port=None, port_specified=False, domain=domain, domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)68     self.__cookie.set_cookie(ck)HttpClient
登录后复制

至于多线程就参考网上找的这段代码好了,还支持并发。。。

 1 from threading import Thread 2 from Queue import Queue 3 from time import sleep 4 #q是任务队列 5 #NUM是并发线程总数 6 #JOBS是有多少任务 7 q = Queue() 8 NUM = 2 9 JOBS = 1010 #具体的处理函数,负责处理单个任务11 def do_somthing_using(arguments):12     print arguments13 #这个是工作进程,负责不断从队列取数据并处理14 def working():15     while True:16         arguments = q.get()17         do_somthing_using(arguments)18         sleep(1)19         q.task_done()20 #fork NUM个线程等待队列21 for i in range(NUM):22     t = Thread(target=working)23     t.setDaemon(True)24     t.start()25 #把JOBS排入队列26 for i in range(JOBS):27     q.put(i)28 #等待所有JOBS完成29 q.join()ThreadDemo
登录后复制

爬虫就靠一段落吧,更深入的爬虫框架以及html解析库暂时放一放,让我考虑考虑接下来的内容,是pygame还是django!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

HTML容易为初学者学习吗? HTML容易为初学者学习吗? Apr 07, 2025 am 12:11 AM

HTML适合初学者学习,因为它简单易学且能快速看到成果。1)HTML的学习曲线平缓,易于上手。2)只需掌握基本标签即可开始创建网页。3)灵活性高,可与CSS和JavaScript结合使用。4)丰富的学习资源和现代工具支持学习过程。

HTML,CSS和JavaScript的角色:核心职责 HTML,CSS和JavaScript的角色:核心职责 Apr 08, 2025 pm 07:05 PM

HTML定义网页结构,CSS负责样式和布局,JavaScript赋予动态交互。三者在网页开发中各司其职,共同构建丰富多彩的网站。

HTML中起始标签的示例是什么? HTML中起始标签的示例是什么? Apr 06, 2025 am 12:04 AM

AnexampleOfAstartingTaginHtmlis,beginSaparagraph.startingTagSareEssentialInhtmlastheyInitiateEllements,defiteTheeTheErtypes,andarecrucialforsstructuringwebpages wepages webpages andConstructingthedom。

了解HTML,CSS和JavaScript:初学者指南 了解HTML,CSS和JavaScript:初学者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

网页批注如何实现Y轴位置的自适应布局? 网页批注如何实现Y轴位置的自适应布局? Apr 04, 2025 pm 11:30 PM

网页批注功能的Y轴位置自适应算法本文将探讨如何实现类似Word文档的批注功能,特别是如何处理批注之间的间�...

Gitee Pages静态网站部署失败:单个文件404错误如何排查和解决? Gitee Pages静态网站部署失败:单个文件404错误如何排查和解决? Apr 04, 2025 pm 11:54 PM

GiteePages静态网站部署失败:404错误排查与解决在使用Gitee...

HTML,CSS和JavaScript:Web开发人员的基本工具 HTML,CSS和JavaScript:Web开发人员的基本工具 Apr 09, 2025 am 12:12 AM

HTML、CSS和JavaScript是Web开发的三大支柱。1.HTML定义网页结构,使用标签如、等。2.CSS控制网页样式,使用选择器和属性如color、font-size等。3.JavaScript实现动态效果和交互,通过事件监听和DOM操作。

如何用CSS3和JavaScript实现图片点击后周围图片散开并放大效果? 如何用CSS3和JavaScript实现图片点击后周围图片散开并放大效果? Apr 05, 2025 am 06:15 AM

实现图片点击后周围图片散开并放大效果许多网页设计中,需要实现一种交互效果:点击某张图片,使其周围的...

See all articles