自学Python十一 Python爬虫总结

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

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

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

1 import urllib2
2 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,urllib2
2 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,cookielib
2 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 urllib2
2 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,zlib
2 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 socket
2 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',req
11             return ''
12     return data

复制代码

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

 HttpClient

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

 ThreadDemo

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

  爬虫demo的github地址(刚学着玩git ):http://git.oschina.net/tabei/Python_spider

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值