quanwei9958 转自 python 爬虫抓取心得分享

urllib.quote('要编码的字符串')

如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用:

urllib.quote('要编码的字符串')

  1. query = urllib.quote(singername)
  2. url = 'http://music.baidu.com/search?key='+query
  3. response = urllib.urlopen(url)
  4. text = response.read()

get or post  urlencode

如果在GET需要一些参数的话,那我们需要对传入的参数进行编码。

  1. import urllib
  2. def url_get():
  3. import urllib
  4. params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
  5. f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
  6. print f.read()
  7.  
  8. def url_post():
  9. import urllib
  10. params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
  11. f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
  12. print f.read()

urllib urllib2 proxy 代理

如果你请求对方的网页,确不想被封IP的话,这个时候就要用到代理了,其实用 urllib 代理还是比较简单的:

  1. import urllib
  2. def url_proxy():
  3. proxies = {'http':'http://211.167.112.14:80'}#或者proxies = {'':'211.167.112.14:80'}
  4. opener = urllib.FancyURLopener(proxies)
  5. f = opener.open("http://www.dianping.com/shanghai")
  6. print f.read()

只用一个代理IP的话 有时候弄巧成拙了 恰好被大众点评给检测出来了

401


211.167.112.14


python-urllib/1.17

那么就试试多个IP代理

  1. import urllib
  2. def url_proxies():
  3. proxylist = (
  4. '211.167.112.14:80',
  5. '210.32.34.115:8080',
  6. '115.47.8.39:80',
  7. '211.151.181.41:80',
  8. '219.239.26.23:80',
  9. )
  10. for proxy in proxylist:
  11. proxies = {'': proxy}
  12. opener = urllib.FancyURLopener(proxies)
  13. f = opener.open("http://www.dianping.com/shanghai")
  14. print f.read()

这回没问题了。

有的时候要模拟浏览器 ,不然做过反爬虫的网站会知道你是robot


例如针对浏览器的限制我们可以设置User-Agent头部,针对防盗链限制,我们可以设置Referer头部

有的网站用了Cookie来限制,主要是涉及到登录和限流,这时候没有什么通用的方法,只能看能否做自动登录或者分析Cookie的问题了。

仅仅是模拟浏览器访问依然是不行的,如果爬取频率过高依然会令人怀疑,那么就需要用到上面的代理设置了

  1. import urllib2
  2. def url_user_agent(url):
  3. '''
  4. proxy = 'http://211.167.112.14:80'
  5. opener = urllib2.build_opener(urllib2.ProxyHandler({'http':proxy}), urllib2.HTTPHandler(debuglevel=1))
  6. urllib2.install_opener(opener)
  7. '''
  8. i_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",\
  9. "Referer": 'http://www.dianping.com/'}
  10. req = urllib2.Request(url, headers=i_headers)
  11.  
  12. return urllib2.urlopen(req).read()
  13.  
  14. #print url_user_agent('http://www.dianping.com/shanghai')

就算设置了代理,代理的ip也有可能被封,还有另外一种终极的办法来防止被封,那便是使用time库的sleep()函数。

  1. import time
  2. for i in range(1,10):
  3. ....#抓取逻辑
  4. time.sleep(5)

抓的地址是http://www.dianping.com/shanghai

直接抓http://www.dianping.com的话会location到城市列表去 反而达不到效果


header: Location: /citylist

  1. 供一段代理IP
  2. proxylist = (
  3. '211.167.112.14:80',
  4. '210.32.34.115:8080',
  5. '115.47.8.39:80',
  6. '211.151.181.41:80',
  7. '219.239.26.23:80',
  8. '219.157.200.18:3128',
  9. '219.159.105.180:8080',
  10. '1.63.18.22:8080',
  11. '221.179.173.170:8080',
  12. '125.39.66.153:80',
  13. '125.39.66.151:80',
  14. '61.152.108.187:80',
  15. '222.217.99.153:9000',
  16. '125.39.66.146:80',
  17. '120.132.132.119:8080',
  18. '119.7.221.137:82',
  19. '117.41.182.188:8080',
  20. '202.116.160.89:80',
  21. '221.7.145.42:8080',
  22. '211.142.236.131:80',
  23. '119.7.221.136:80',
  24. '211.151.181.41:80',
  25. '125.39.66.131:80',
  26. '120.132.132.119:8080',
  27. '112.5.254.30:80',
  28. '106.3.98.82:80',
  29. '119.4.250.105:80',
  30. '123.235.12.118:8080',
  31. '124.240.187.79:80',
  32. '182.48.107.219:9000',
  33. '122.72.2.180:8080',
  34. '119.254.90.18:8080',
  35. '124.240.187.80:83',
  36. '110.153.9.250:80',
  37. '202.202.1.189:80',
  38. '58.67.147.205:8080',
  39. '111.161.30.228:80',
  40. '122.72.76.130:80',
  41. '122.72.2.180:80',
  42. '202.112.113.7:80',
  43. '218.108.85.59:81',
  44. '211.144.72.154:80',
  45. '119.254.88.53:8080',
  46. '121.14.145.132:82',
  47. '114.80.149.183:80',
  48. '111.161.30.239:80',
  49. '182.48.107.219:9000',
  50. '122.72.0.28:80',
  51. '125.39.68.131:80',
  52. '118.244.190.6:80',
  53. '120.132.132.119:88',
  54. '211.167.112.15:82',
  55. '221.2.80.126:8888',
  56. '219.137.229.214:3128',
  57. '125.39.66.131:80',
  58. '61.181.22.157:80',
  59. '115.25.216.6:80',
  60. '119.7.221.137:82',
  61. '221.195.42.195:8080',
  62. '119.254.88.53:8080',
  63. '219.150.254.158:8080',
  64. '113.9.163.101:8080',
  65. '222.89.154.14:9000',
  66. '114.141.162.53:8080',
  67. '218.5.74.199:3128',
  68. '61.152.108.187:80',
  69. '218.76.159.133:80',
  70. '59.34.57.88:8080',
  71. '118.244.190.34:80',
  72. '59.172.208.189:8080',
  73. '116.236.216.116:8080',
  74. '111.161.30.233:80',
  75. '220.248.237.234:8080',
  76. '121.14.145.132:82',
  77. '202.114.205.125:8080'
  78. )

Proxy的使用相当广泛,对于单个应用来说,爬虫是很容易被封禁,如果使用Proxy模式,就能降低被封的风险,所以有需求的同学需要仔细看下Python urllib2对于Proxy的使用:

抓取下拉加载或者点击加载的页面方法:

加载中的内容应该是ajax请求的,对付ajax请求没有什么好的办法,只有抓取页面的JS,分析JS进行抓取

解决方案:

1.傻傻的全部下拉完 全部点击加载完(对少量数据还行,大量数据的站去死吧) 在Firefox里面copy出源码信息 进

行正则匹配

    2.HttpFox抓包  直接抓ajax地址的数据  分析ajax链接 变换参数  取得json后再正则

0x5.正则处理

python对正则表达式的支持模块。如果http库有选择的余地外,re几乎是没有选择余地的工具。因为有正则表达式的存在,所以让我们可以很灵活的去抠取抓取过来的完整html中所需要的部分。

当然,这篇文章不会详细解释正则表达式,因为如果要系统的介绍正则表达式,或许可以写一本书了。这里只简单提一下我们后面会用到的python正则表达式的用法。

re.compile()。如果正则表达式比较多,请一

定要先用这个方法先行编译正则表达式,之后再正则表达式的使用就会很非常快,因为大家都知道,python文件在第一次运行会分别创建一个字节码文件,如
果正则表达式作为字符串的时候,在运行时才会被编译,是会影响到python的执行速度的。

compile()返回的是一个re对象,该对象拥有re库的search(), match(), findall()等方法,这三个方法,在后面会被频繁的用到,生成被编译的re对象还有一个好处是调用方法不用再传入字符串的正则表达式。

search()主要用来校验正则表达式能否匹配字符串中的一段,通常用来判断该页面是否有我需要的内容。

match()用来判断字符串是否完全被一个正则表达式匹配,后面用的比较少。

findall()用来搜索正则表达式在字符串中的所有匹配,并返回一个列表,如果没有任何匹配,则返回一个空列表。

带有子组的正则表达式,findall()返回的列表中的每个元素为一个元组,正则表达式中有几个子组,元组中就会有几个元素,第一个元素为第一个括号中的子组匹配到的元素,以此类推。

findall()和search()是有类似之处的,都是搜索正则表达式在字符串中的匹配,但是findall()返回一个列表,search()返回一个匹配对象,而且findall()返回的列表中有所有匹配,而search()只返回第一个匹配的匹配对象。

  1. 0x6.Reference
  2.  
  3. python urllib下载网页
  4. http://www.cnpythoner.com/post/pythonurllib.html
  5.  
  6. 关于不得不在python中使用代理访问网络的方法
  7. http://blogread.cn/it/wap/article/1967
  8.  
  9. python使用urllib2抓取防爬取链接
  10. http://www.the5fire.net/python-urllib2-crawler.html
  11.  
  12. Python实战中阶(一)——爬取网页的一点分享
  13. http://blog.goodje.com/2012-08/python-middle-action-web-crawler.html
  14.  
  15. Python Urllib2使用:代理及其它
  16. http://isilic.iteye.com/blog/1806403
  17.  
  18. Python urllib2递归抓取某个网站下图片
  19. http://blog.csdn.net/wklken/article/details/7364899
  20.  
  21. Python抓网页的注意事项
  22. http://blog.raphaelzhang.com/2012/03/issues-in-python-crawler/
  23.  
  24. urllib.urlretrieve下载图片速度很慢 + 【已解决】给urllib.urlretrieve添加user-agent
  25. http://www.crifan.com/use_python_urllib-
  26.  
  27. urlretrieve_download_picture_speed_too_slow_add_user_agent_for_urlretrieve/

python 爬虫抓取心得的更多相关文章

  1. Python爬虫----抓取豆瓣电影Top250

    有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息. 1.观察url 首先观察一下网址的结构 http://movie.douban.com/to ...

  2. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  3. python爬虫抓取哈尔滨天气信息(静态爬虫)

    python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...

  4. Python爬虫 -- 抓取电影天堂8分以上电影

    看了几天的python语法,还是应该写个东西练练手.刚好假期里面看电影,找不到很好的影片,于是有个想法,何不搞个爬虫把电影天堂里面8分以上的电影爬出来.做完花了两三个小时,撸了这么一个程序.反正蛮简单 ...

  5. Python 爬虫: 抓取花瓣网图片

    接触Python也好长时间了,一直没什么机会使用,没有机会那就自己创造机会!呐,就先从爬虫开始吧,抓点美女图片下来. 废话不多说了,讲讲我是怎么做的. 1. 分析网站 想要下载图片,只要知道图片的地址 ...

  6. python爬虫 抓取一个网站的所有网址链接

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  7. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)

    最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分析(必须要弄清楚自己的目的),另外就是要考虑对爬取的数据归类,存储. ...

  8. Python爬虫--抓取糗事百科段子

    今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单.程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该 ...

  9. python 爬虫抓取 MOOC 中国课程的讨论区内容

    一:selenium 库 selenium 每次模拟浏览器打开页面,xpath 匹配需要抓取的内容.可以,但是特别慢,相当慢.作为一个对技术有追求的爬虫菜鸡,狂补了一些爬虫知识.甚至看了 scrapy ...

随机推荐

  1. poj2367 拓扑序

    题意:有一些人他们关系非常复杂,一个人可能有很多后代,现在要制定一种顺序,按照前辈在后代前排列就行 拓扑序裸题,直接建边拓扑排序一下就行了. #include<stdio.h> #incl ...

  2. html 绑定

    html 绑定 目的 html绑定到DOM元素上,使得该元素显示的HTML值为你绑定的参数.如果在你的view model里声明HTML标记并且render的话,那非常有用.   例子 <div ...

  3. ls命令大全

    ls 命令:15个Linux面试级问题--第一集 [日期:2015-03-12] 来源:Linux社区  作者:GuiltyMan [字体:大 中 小]   注释:'ls'是“list”的意思,重点在 ...

  4. 黑马程序员——JAVA基础之final this.和super.的区别

    ------- android培训.java培训.期待与您交流! ----------  final关键字: final可以修饰类,方法,变量. final修饰的类不可以被继承. final修饰的方法 ...

  5. apache性能优化

    perfork进程数 http://sookk8.blog.51cto.com/455855/275759/ mod_cache 磁盘缓存 http://www.cnblogs.com/fnng/ar ...

  6. 无shell情况下的mysql远程mof提权利用方法详解

    扫到一个站的注入<ignore_js_op> 在havij中得到mysql数据库中mysql库保存的数据库密码:<ignore_js_op> 有时候发现1.15版的还是最好用, ...

  7. 将HTML段赋值给PHP变量的便捷方法,不使用转义字符

    <?php $b='12'; $a=<<<sss <html> <head> </head> <body> <i>& ...

  8. 【HACK】破解APK并注入自己的代码

    请不要去干坏事! 使用工具: APKTool 提醒:能够正常安装到手机上的APK都是带有签名的(不了解签名的可以百度),APK在破解重新打包后是已经不再拥有签名的,如果想要你破解后的APK能够正常运行 ...

  9. unity3d用鼠标拖动物体的一段代码

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 这是一段拖动物体的代码,比较简洁明了,对了解uni ...

  10. mrtg

    centos6.5-64-minimal http://oss.oetiker.ch/mrtg/doc/cfgmaker.en.htmlhttp://www.cnblogs.com/see7di/ar ...