'''
useragent_list = [
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; CLR 1.1.4322; CLR 2.0.50727; CLR 3.0.04506.30)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; CLR 1.1.4322)',
'Opera/9.20 (Windows NT 6.0; U; en)',
'Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.1; CLR 1.1.4322)',
'Opera/9.00 (Windows NT 5.1; U; en)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.0',
'Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1',
]
size = len(useragent_list)
useragent = useragent_list[random.randint(0, size-1)]
s = StringIO.StringIO()
c = Curl()
c.setopt(NOSIGNAL, True)
c.setopt(FOLLOWLOCATION, True)
c.setopt(MAXREDIRS, 5)
c.setopt(TIMEOUT, 120)
for key in kwargs:
c.setopt(locals()[key], kwargs[key])
c.setopt(URL, url)
c.setopt(WRITEFUNCTION, s.write)
if ‘USERAGENT’ not in kwargs:
c.setopt(USERAGENT, useragent)
if ‘REFERER’ not in kwargs:
c.setopt(REFERER, url)
while 1:
try:
c.perform()
break
except:
if retry:
time.sleep(delay)
else:
return False
return s.getvalue()
对简单的收集里面需要用到的下载功能,已经被整合在了这个模块之中。如User-agent轮换、自动301/302跳转等、使用当前URL作为REFERER的有些取巧的体例等。这个模块的代码可以日后再慢慢理解,现在只要知道它的用法便可。
首先到放置Python脚本的目录,将前面一段代码保存为curl.py,然后在同一目录下成立一个新文件,输入以下测试代码:
# -*- coding:utf-8 -*-
import curl
print curl.curl('http://g/') #这样即下载了一个网页
#以下是比较保险的下载体例,因为各类原因,就算总体很稳定的网站也偶尔会呈现网页暂时无法打开的情况
#当网页下载出错时,如果retry为True,则会不竭重试,直到下载完网页
#delay则指定了几次重试之间的时间距离,以秒为单位
print curl.curl('http://g/', retry=True, delay=1)
#以下用到了一些Curl的参数,详细说明可见:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
print curl.curl('http://g/', FOLLOWLOCATION=False, COOKIE='mycookie')
这个模块会在以后几近每个脚本里面都用到,所以这些根本用法务必服膺。接下来是监控网站关头词排名的正式代码:
cron.py
# -*- coding:utf-8 -*-
#加载模块,此处年夜致按功能划分行,是为了能够更便利理解代码
import sys, os, random, time, datetime
import urllib, re
import curl
#sys.argv是系统参数,1:3切片意味着读取参数2,3,别离赋值给两个变量
site, file_keyword = sys.argv[1:3]
keywords =[] #先将keywords声明初始为列表型变量
#迭代文件,每次读取一行文字
for line in open(file_keyword):
line = line.rstrip() #将行尾的空白字符去失落,一般行尾会有换行符等
if line:#判断该行是否是空白行,也可更标准的写作if len(line)!=0:
keywords.append(line) #将读取到的文字插手到keywords列表中
#获得UTC时间,之所以使用UTC时间是为了避免时区问题带来的未知麻烦
#北京时间是UTC+8,如该日UTC时间01:00相当于北京时间09:00
now = datetimetime.utcnow()
#将UTC时间格局化,酿成如1970-01-01的格局
date = datetimetime.strftime(now, '%Y-%m-%d')
#测验测验成立文件夹,如果文件夹已成立则跳过
try:
os.mkdir('/home/rank/')
except:
pass
#打开输出数据的文件,以当日的日期命名它
f = open('/home/rank/%s.csv' % date, 'w')
for keyword in keywords:
#因为关头词多是非ASCII字符集的,所以需要编码
encoded_keyword = urllib.quote_plus(keyword)
#下载SERP并提取链接
url = '.百度/s?wd=%s&rn=100' % encoded_keyword
#下载SERP,如果呈现验证码即延时10分钟并重试
while 1:
html = curl.curl(url, retry=True, delay=60)
if '<img src="http://verify.百度/cgi-bin/' in html:
except:
f.write('%st%dt%sn' % (keyword, -1, '-'))
continue
#如果在前100名找到网站,则find=True