发现更大的SEO世界
 找回密码
 注册
搜索
»首页»SEO培训 SEO论坛 SEO交流 帖子
12下一页
发新帖
ZERO,SEO执着爱好者    

人人会Python系列(1)——采集网页模拟表单利器pycurl

对于论坛较常见的贴自己写的代码的帖子,总的而言并不是很推荐,将他人的代码套入自己的需求往往比较难。而通用性的教程,可以帮到更多人更轻松的搞定自己的技术需求,这些是相对更推荐在论坛分享的内容。

这边就开一个系列,讲Python可以如何用来处理一些SEO需求,主要是一些模块的使用方法等。至于Python最基础的语法、类型等等知识,此处不做多的介绍,一般到京东买国外出版的最畅销的相关书籍看看即可。

本帖要介绍的是pycurl,它通常被用来采集网页、与模拟表单提交,是实现自动化操作的关键环节。

安装pycurl的方式是,先安装python-setuptools再执行easy_install pycurl,或者在ubuntu等系统直接运行apt-get install python-pycurl(推荐,各类模块通常情况下最容易的安装方式),或者在windows等系统找exe的安装包。

比如我们想查某个关键词的首页有没有我们的网站排着,一个简单版本的代码如下:

  1. import urllib, urllib2

  2. kw = '团购'
  3. html = urllib2.urlopen('http://www.baidu.com/s?wd=' + urllib.quote_plus(kw))
  4. if '.meituan.com' in html:
  5.         print '有排名'
  6. else:
  7.         print '无排名'
复制代码


但这段代码尽管能粗略实现功能,却有很多问题在。比如有时下载搜索结果页会一直打不开,这段代码就会卡住;又如这段代码没有伪装自己是浏览器,多次查排名容易被搜索引擎封IP。

尽管urllib2模块配合其它一些模块,也能做到各种各样的事情,但是比较繁琐。pycurl来做些事情只要通过一些参数的配置即可。

  1. import pycurl
  2. import StringIO

  3. def curl(url, debug=False, **kwargs):
  4.         while 1:
  5.                 try:
  6.                         s = StringIO.StringIO()
  7.                         c = pycurl.Curl()
  8.                         c.setopt(pycurl.URL, url)
  9.                         c.setopt(pycurl.REFERER, url)
  10.                         c.setopt(pycurl.FOLLOWLOCATION, True)
  11.                         c.setopt(pycurl.TIMEOUT, 60)
  12.                         c.setopt(pycurl.ENCODING, 'gzip')
  13.                         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')
  14.                         c.setopt(pycurl.NOSIGNAL, True)
  15.                         c.setopt(pycurl.WRITEFUNCTION, s.write)
  16.                         for k, v in kwargs.iteritems():
  17.                                 c.setopt(vars(pycurl)[k], v)
  18.                         c.perform()
  19.                         c.close()
  20.                         return s.getvalue()
  21.                 except:
  22.                         if debug:
  23.                                 raise
  24.                         continue

  25. kw = '团购'
  26. html = curl('http://www.baidu.com/s?wd=' + urllib.quote_plus(kw))
  27. if '.meituan.com' in html:
  28.         print '有排名'
  29. else:
  30.         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模拟提交表单的例子解释下:

  1. from base import curl
  2. import urllib

  3. post = urllib.urlencode({
  4.         'key': 'value'       
  5. })

  6. print curl(url, POSTFIELDS=post)
复制代码


提交表单就是这么方便,可以轻松完成批量注册发表、数据获取等任务。

-----------------------------

若有没明白的地方,建议先百度相关知识。但若确实是帖子没写明白,欢迎提问。

评分

参与人数 12赞同 +49 收起 理由
刀心 + 1 抄下来用一用。
酱油 + 4 赞一个!
波波 + 4 赞一个!
赵伟 + 4 刚好想学Python
混混 + 4 很给力!
姜姜 + 4 赞一个!
叶枫 + 4 感谢zero
panda + 4 有了zero,其他什么都是浮云
老狼 + 4 学习起来
fred + 8 很给力!
者一 + 4 下决心学会python了!
AIR_seoqx + 4 系统的学习比用别人的代码更好.

查看全部评分

发表于 2014-6-30 18:30:26 |只看大图
回复 收藏
行书,请到个人资料页面设置个人签名    

pycurl

win下安装python 是没有安装pycurl的,因此要再安装pycurl
http://www.seoqx.com/forum.php?m ... l%E5%AE%89%E8%A3%85
这里有链接

可以考虑用wubi安装ubuntu(行书 我 还是没安装- -|||)
发表于 2014-6-30 19:23:36
回复 收藏
老狼,老狼博客 www.lanzhihui.com    [ 版主 ]

本帖最后由 老狼 于 2014-6-30 22:19 编辑

发现学Py,有些吃力
发表于 2014-6-30 23:23:31
回复 收藏
maimai,游离seo ppc,收入漂浮不定,频繁大起大落    

都是python cygwin shell
发表于 2014-7-1 14:12:24
回复 收藏
lycfaint,好好学习SEO,争取从穷屌丝变成会SEO的屌丝    

9-16行是设置采集的参数,也就是说,为了更好地模拟一般用户,是不是就该设置一些随机的参数,这样就更像一般用户了?有点疑惑的是14行那,如果我用别的,蜘蛛就会以为是这么个客户端在访问了吧?

评分

参与人数 1赞同 +4 收起 理由
lewin + 4

查看全部评分

发表于 2014-7-1 16:02:55
回复 收藏
lewin,态度比能力更重要,选择也比能力更重要。    

为什么的总提示  c.setopt(pycurl.NOSIGNAL, True)  这段错误呢

  File "BaiduRank.py", line 26
    c.setopt(pycurl.NOSIGNAL, True)
    ^
IndentationError: unexpected indent

评分

参与人数 2赞同 +8 收起 理由
single + 4 山寨
mage + 4 淡定

查看全部评分

发表于 2014-7-1 16:24:11
回复 收藏
ZERO,SEO执着爱好者    

lewin 发表于 2014-7-1 08:24
为什么的总提示  c.setopt(pycurl.NOSIGNAL, True)  这段错误呢

  File "BaiduRank.py", line 26

Python的缩进坑。调整下每行前面的tab或空格。
 楼主| 发表于 2014-7-1 16:28:12
回复 收藏
ZERO,SEO执着爱好者    

lycfaint 发表于 2014-7-1 08:02
9-16行是设置采集的参数,也就是说,为了更好地模拟一般用户,是不是就该设置一些随机的参数,这样就更像一 ...

随网站防采集机制而异,一般随机设置无助于绕过防采集机制。
 楼主| 发表于 2014-7-1 16:29:14
回复 收藏
52gcs,一条路走到黑    [ 版主 ]

集成多线程了嘛
发表于 2014-7-1 16:50:10
回复 收藏
ZERO,SEO执着爱好者    

52gcs 发表于 2014-7-1 08:50
集成多线程了嘛

没有,系列之后的文章或许写下多线程怎么搞,大规模采集网页的情况下用得上。
 楼主| 发表于 2014-7-1 17:09:32
回复 收藏
born,个人微信公众账号:jinan_seo请马上关注    

看来基础的还是得需要买本书去学习啊!技术盲人!
发表于 2014-7-2 11:17:22
回复 收藏
莫山,改我论坛密码的没有小JJ,哼!!!    

ZERO 发表于 2014-7-1 09:09
没有,系列之后的文章或许写下多线程怎么搞,大规模采集网页的情况下用得上。 ...

最近在学多线程,这东西还是需要懂些概念性的东西感觉不好讲的,直接封装起来用好了。。我个人学习进度很慢。
发表于 2014-7-2 20:13:13
回复 收藏
vscvscvsc,回炉重炼    

莫山 发表于 2014-7-2 12:13
最近在学多线程,这东西还是需要懂些概念性的东西感觉不好讲的,直接封装起来用好了。。我个人学习进度很 ...

python的多线程看得我一头雾水,后来索性一直都用单线程来处理了~
发表于 2014-7-3 10:05:21
回复 收藏
莫山,改我论坛密码的没有小JJ,哼!!!    

vscvscvsc 发表于 2014-7-3 02:05
python的多线程看得我一头雾水,后来索性一直都用单线程来处理了~

网上的所有教程我都看不懂,现在在看书,终于能看懂了。
发表于 2014-7-3 11:02:56
回复 收藏
波波,seo爱好者    

后面那个模拟表单注册,不需要验证码么
发表于 2014-7-4 11:25:20
回复 收藏
12下一页
快速回复 返回顶部 返回列表