昨天得到一个任务,是抓以ajax技术获得的动态网页的数据。这个任务与之前任务的区别在于,之前的静态数据只需要get抓取一次;而动态网页则其静态部分在第一次请求的时候返回,但是其动态的部分则需要在第一次请求之后,获取cookie然后再用这个cookie去向服务器提交请求,之后才能够获取到网页动态部分的数据。
总结一下这个探索的过程,起初使用httplib在做这个功能,结果调试很久没有找到问题所在。然后换成urllib,urllib2这两个类库再尝试,结果每次只能够获得网页的静态页面部分,动态部分总是为空。这样试了很多种方法,方法记录在探索日志中。最后去问师兄才把问题给弄清楚,之后回来自己尝试用cookie去提交请求,最终获得了需要的数据。
这次再最基本的架构上面出了问题,就是查询的次数的问题。这样看来,如果前期对问题的连续互补边界形态和条件过程的连续互补时间过程分析不清楚的话,后期的尝试就会很局限。因而,先画处理条件的流程图和处理目标的结构图,再画处理程序的架构图和流程图。这样效率才能够提的上去。
贴上我的代码吧:
#coding=utf-8
'''
author: yao
'''
import urllib, urllib2, socket, cookielib
from urllib2 import HTTPCookieProcessor
def getCookie():
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1\r\n',
}
url1='http://flight.qunar.com/twell/cookie/allocateCookie.jsp'
req1=urllib2.Request(url1, headers=header)
#generagte the cookie jar to store the cookie
ckjar=cookielib.MozillaCookieJar('qunar.cookie')
ckproc=urllib2.HTTPCookieProcessor(ckjar)
opener=urllib2.build_opener(ckproc)
f=opener.open(req1)
htm=f.read()
# print htm
f.close()
#save cookie in the cookie
ckjar.save(ignore_discard=True, ignore_expires=True)
url2='http://flight.qunar.com/twell/flight/Search.jsp?from=fi_ont_search&searchType=OnewayFlight&fromCity=%E6%88%90%E9%83%BD&toCity=%E5%A4%A9%E6%B4%A5&fromDate=2012-08-24&toDate=2012-08-28'
#construct the request
reqss=urllib2.Request(url2)
#process the new cookie
ckproc2=urllib2.HTTPCookieProcessor(ckjar)
#construct the opener
opener2=urllib2.build_opener(ckproc2)
#open the url using cookie
page2=opener2.open(reqss)
# print page2.read()
print ckjar._cookies
url3='http://flight.qunar.com/twell/flight/DynamicFlightInfo.jsp?&departureCity=%E6%88%90%E9%83%BD&arrivalCity=%E5%A4%A9%E6%B4%A5&departureDate=2012-08-24&fromCity=%E6%88%90%E9%83%BD&toCity=%E5%A4%A9%E6%B4%A5&from=fi_ont_search&_token=99798'
req3=urllib2.Request(url3)
ckproc3=urllib2.HTTPCookieProcessor(ckjar)
opener3=urllib2.build_opener(ckproc3)
page3=opener3.open(req3)
print page3.read()
print ckjar._cookies
getCookie()
只是拿来的文章,留个存档,可不保证能用
- 使用已有的cookie访问网站
import cookielib, urllib2
ckjar = cookielib.MozillaCookieJar(os.path.join(’C:\Documents and Settings\tom\Application Data\Mozilla\Firefox\Profiles\h5m61j1i.default’, ‘cookies.txt’))
req = urllib2.Request(url, postdata, header)
req.add_header(’User-Agent’, \
‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)’)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )
f = opener.open(req)
htm = f.read()
f.close()
- 访问网站获得cookie,并把获得的cookie保存在cookie文件中
import cookielib, urllib2
req = urllib2.Request(url, postdata, header)
req.add_header(’User-Agent’, \
‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)’)ckjar = cookielib.MozillaCookieJar(filename)
ckproc = urllib2.HTTPCookieProcessor(ckjar)opener = urllib2.build_opener(ckproc)
f = opener.open(req)
htm = f.read()
f.close()ckjar.save(ignore_discard=True, ignore_expires=True)
- 使用指定的参数生成cookie,并用这个cookie访问网站
import cookielib, urllib2
cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
values = {’redirect’:”, ‘email’:'abc@abc.com’,
‘password’:'password’, ‘rememberme’:”, ’submit’:'OK, Let Me In!’}
data = urllib.urlencode(values)request = urllib2.Request(url, data)
url = urlOpener.open(request)
print url.info()
page = url.read()request = urllib2.Request(url)
url = urlOpener.open(request)
page = url.read()
print page