栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

人人会Python——采集网页模拟表单利器pycurl

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

人人会Python——采集网页模拟表单利器pycurl

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

  这边就开一个系列,讲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)

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


文章源自:http://www.seoqx.com/post/341

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/226174.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号