python简易爬虫

2017-05-01
昨晚瞎玩了一下把博客搞挂了,反正也没什么东西又重新弄了一下2333

前几天有一门课的网上答题开放了,在百度的协助下还是得到了一个不可描述的分数,题库1k+的题我才懒得背呢。那就就当爬虫入门课吧,以前写过php的简易爬虫,那就换成python了解一下神奇的语言好了。

接下来会简单说说小爬虫的实现过程。

由于第一次写需要登录验证的小爬虫,想了想能不能先在浏览器里登录一下,然后再直接用浏览器的请求头构造header。

url = '****'
post_data = '****'
headers = {
    'Host': '****',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate',
    'Referer': 'http://****/****/homepage/common/index.jsp',
    'Cookie': 'JSESSIONID=****37D32FF37BB2631264E23475CE36',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': 1
    }

然后戳一下

login = urllib2.Request(url,post_data,headers)
response = urllib2.urlopen(login)
text = response.read(urllib2.urlopen(login))

哇!!果然没用……


开始是觉得浏览器已经登录过了的话,打开一个网页也是登录了的,所以天真的以为浏览器登录过后用浏览器的headers模拟请求也是已经登录的。
看来并不是这样。那就加个登录验证,再保存一下cookie从登录页面跳转。

filename = 'cookie.txt'
# 声明一个MozillaCookieJar对象实例来保存cookie
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#用户名、密码
postdata = urllib.urlencode({
    "IPT_LOGINUSERNAME":"****",
    "IPT_LOGINPASSWORD":"****"
    })
loginUrl = '****'
result = opener.open(loginUrl,postdata)
# 保存cookie到cookie.txt
cookie.save(ignore_discard=True, ignore_expires=True)
print cookie

登录过程没问题了……那就请求一下题库再把题目和答案筛选出来就行了,步骤没几步,但是匹配需要的内容折腾了好久,感谢py的BeautifulSoup库,只要两行就搞定了筛选。编码是gbk的,直接用file("out","w+")处理不了,反正py多的是库,加上codecs库后搞定,写起来就是爽~

f = codecs.open('out.txt','w+','gbk')
for i in range(0,****):
    id = **** + i*5
    str = '%d' %id
    no = '%d' %i
    aimUrl = '****' + str
    result = opener.open(aimUrl)
    result = result.read()
    soup = BeautifulSoup(result,"lxml")
    #匹配题目
    question = soup.find(id=re.compile("_content")).get("value")
    #匹配出正确答案
    answer = soup.select('input[checked]')
    f.write(no+"*******************************************************************\n")
    f.write(question)
    for a in answer:
        f.write(a.parent.parent.get_text())
    print i
    print "\n"
f.close()

反正就完美了,题库一共1435题,百度还好多搜不了。这会儿就美滋滋。

同学们我就帮到这了,方法就这几步,直接要题目也行,等上几天我搞个网站出来玩一玩(挖坑埋自己)。
说好的答题脚本……说好的搞个答题代理网站收集同学们的学号密码走上人生巅峰……
懒的不行……睡了一天又一天……

吐槽一下……怎么写的那么丑啊……