对于论坛较常见的贴自己写的代码的帖子,总的而言并不是很推荐,将他人的代码套入自己的需求往往比较难。而通用性的教程,可以帮到更多人更轻松的搞定自己的技术需求,这些是相对更推荐在论坛分享的内容。
这边就开一个系列,讲Python可以如何用来处理一些SEO需求,主要是一些模块的使用方法等。至于Python最基础的语法、类型等等知识,此处不做多的介绍,一般到京东买国外出版的最畅销的相关书籍看看即可。
本帖要介绍的是pycurl,它通常被用来采集网页、与模拟表单提交,是实现自动化操作的关键环节。
安装pycurl的方式是,先安装python-setuptools再执行easy_install pycurl,或者在ubuntu等系统直接运行apt-get install python-pycurl(推荐,各类模块通常情况下最容易的安装方式),或者在windows等系统找exe的安装包。
比如我们想查某个关键词的首页有没有我们的网站排着,一个简单版本的代码如下:
- import urllib, urllib2
- kw = '团购'
- html = urllib2.urlopen('http://www.baidu.com/s?wd=' + urllib.quote_plus(kw))
- if '.meituan.com' in html:
- print '有排名'
- else:
- print '无排名'
复制代码
但这段代码尽管能粗略实现功能,却有很多问题在。比如有时下载搜索结果页会一直打不开,这段代码就会卡住;又如这段代码没有伪装自己是浏览器,多次查排名容易被搜索引擎封IP。
尽管urllib2模块配合其它一些模块,也能做到各种各样的事情,但是比较繁琐。pycurl来做些事情只要通过一些参数的配置即可。
- import pycurl
- import StringIO
- def curl(url, debug=False, **kwargs):
- while 1:
- try:
- s = StringIO.StringIO()
- c = pycurl.Curl()
- c.setopt(pycurl.URL, url)
- c.setopt(pycurl.REFERER, url)
- c.setopt(pycurl.FOLLOWLOCATION, True)
- c.setopt(pycurl.TIMEOUT, 60)
- c.setopt(pycurl.ENCODING, 'gzip')
- c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36')
- c.setopt(pycurl.NOSIGNAL, True)
- c.setopt(pycurl.WRITEFUNCTION, s.write)
- for k, v in kwargs.iteritems():
- c.setopt(vars(pycurl)[k], v)
- c.perform()
- c.close()
- return s.getvalue()
- except:
- if debug:
- raise
- continue
- kw = '团购'
- html = curl('http://www.baidu.com/s?wd=' + urllib.quote_plus(kw))
- if '.meituan.com' in html:
- print '有排名'
- else:
- print '无排名'
复制代码
pycurl版本的代码虽然看上去比前面个版本麻烦得多,但可以实现稳定的下载百度的搜索结果页,且不容易被封IP(但实际用于监控时,还是要做IP是否被封的判断,若被封就自动延时重试)。
这里的curl方法是一个通用的方法,可以将它保存到一个模块里面,下次下载网页直接curl(url)即可,不用重复完成上述代码。这是很重要的一点,SEO写程序一般只是用来解决自己的需求,没必要太深入具体某代码到底是为什么,只要会用就好。尤其在学习初期,代码与其说是写出来的,不如说是一块块拼出来的,只要能解决问题就好。
解释一下上述代码中的几个参数:
REFERER,访问该网页前面访问的什么网页,一般用于伪装浏览器
FOLLOWLOCATION,在网页设置301、302等跳转时,是否跟随跳转
TIMEOUT,网页多少秒没有打开时,报错
ENCODING,可以开启gzip压缩,提高下载速度
USERAGENT,设置浏览器标示,伪装浏览器的主要点
NOSIGNAL,若不设置这项,多线程使用pycurl时会报错,一般总是建议开启
URL和WRITEFUNCTION是下载网页用的,必备。
以上参数在我写的curl方法中,已默认配置,其它参数可以通过**kwargs来追加。
参数说明见:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
来一个post模拟提交表单的例子解释下:
- from base import curl
- import urllib
- post = urllib.urlencode({
- 'key': 'value'
- })
- print curl(url, POSTFIELDS=post)
复制代码
提交表单就是这么方便,可以轻松完成批量注册发表、数据获取等任务。
-----------------------------
若有没明白的地方,建议先百度相关知识。但若确实是帖子没写明白,欢迎提问。 |