python动态网页爬取——四六级成绩批量爬取
需求:
四六级成绩查询网站我所知道的有两个:学信网(http://www.chsi.com.cn/cet/)和99宿舍(http://cet.99sushe.com/),这两个网站采用的都是动态网页。我使用的是学信网,好了,网站截图如下:
网站的代码如下:
<form method="get" name="form1" id="form1" action="/cet/query"> <table border="0" align="center" cellpadding="0" cellspacing="0">
<tr><td align="right">准考证号:</td><td align="left"><input name="zkzh" value="112008000463141" id="zkzh" type="text" size="18" maxlength="15" class="input_text input_t_l" /></td>
<td align="left" class="font12 color666">请输入15位准考证号</td>
</tr>
<tr><td align="right">姓名:</td><td align="left"><input name="xm" value="啊啊" id="xm" type="text" size="18" maxlength="50" class="input_text input_t_l" /></td>
<td align="left" class="font12 color666">姓名超过3个字,可只输入前3个</td>
</tr> <tr><td align="center"> </td>
<td colspan="2" align="left"><input type="submit" id="submitCET" class="btn_blue" value="查询" /></td>
</tr>
</table>
</form>
由图中可以看出表单提交的链接为/cet/query,即:http://www.chsi.com.cn/cet/query,好了,填写表单和结果如下:
但是,点击查看源代码之后发现,没有成绩,即代码仍是上面那个,之后按F12查看代码:
<TBODY><TR>
<TH>姓名:</TH>
<TD>XXXX</TD></TR>
<TR>
<TH>学校:</TH>
<TD>XXXXXX</TD></TR>
<TR>
<TH>考试类别:</TH>
<TD>英语四级</TD></TR>
<TR>
<TH>准考证号:</TH>
<TD>120135151100101</TD></TR>
<TR>
<TH>考试时间:</TH>
<TD>2015年06月</TD></TR>总分:</TH><TD class=fontBold vAlign="top"><SPAN class=colorRed>403 </SPAN><BR><SPAN class=color666>听力:</SPAN> 132 <BR><SPAN class=color666>阅读:</SPAN> 147 <BR><SPAN class=color666>写作与翻译:</SPAN> 124 </TD></TR>
该代码显示了成绩,可以知道,该网站使用的是动态网页,用的JavaScript或者Ajax.js还是其他的我就不知道了0.0。上面为需求。
前言:使用过BeautifulSoup爬取过,但是BeautifulSoup是爬取不了动态网页的,上各种论坛找各种资料,用了n种东西,scapy,pyqt等等,走了真心不少弯路,不是不行,应该是我不会用,最终用了selenium和phantomjs,这两个应该也是目前最流行的爬虫模块了吧。
一、导入selenium和phantomjs
from selenium import webdriver driver = webdriver.PhantomJS(executable_path='D:\phantomjs-2.1.1-windows\phantomjs.exe')
driver.get(url)
driver.find_element_by_id('zkzh').send_keys(i)
driver.find_element_by_id('xm').send_keys(xm)
driver.find_elements_by_tag_name('form')[1].submit()
代码说明:
3.selenium可以加载很多驱动,比如Chrome、FireFox等,这里需要有这两个浏览器和驱动才行,折腾了一下,网上说Phantomjs是较好的了
5、6、7分别是准考证号,姓名和提交
二、字符处理
提交之后就可以直接查找了:
print driver.find_element_by_xpath("//tr[3]/td[1]").text
print driver.find_element_by_xpath("//tr[6]/td[1]").text
代码说明:
1.查看姓名
2.查看分数及其具体成绩
打印之后为:
姓名
403
听力
132
阅读
147
写作
142
之后要对分数进行字符串处理,选取各部分的数字,这里我们采用re模块:
import re
m = re.findall(r'(\w*[0-9]+)\w*', chuli2)
其中m是数组,输出的是["403","132","147","142"]
三、数据库
我们学校也不知说很渣还是人性化,反正公布了全校的四六级准考证号,当然,是excel的,需要导入mysql数据库,打开Excel之后,我发现微软大法和Oracle真是牛逼啊,Excel365居然有mysql workbench连接部分
数据库代码如下:
import MySQLdb conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='cet', port=3306, charset='utf8')
cur = conn.cursor()
curr = conn.cursor()
cur.execute("select name from cet.cet where zkzh=(%s)" % i)
xm = cur.fetchone()[0]
print "Name is " + xm
sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % (
ss, m[0], m[1], m[2], m[3], i)
cur.execute(sqltxt)
conn.commit()
cur.close()
conn.close()
代码说明:
3.python连接数据库代码
6.连接数据库取得姓名部分
9.这行我好无语啊,使用‘“+ss+”’这样的写法一直报错,最终找了半天资料,这个写法我不太喜欢,但是凑合着用吧。
12.记得一定要提交事务!!!commit()!!!不然是没有效果的
四、使用代理服务器(保留以后写)
运行了一段时间之后,大概抓了几百人的吧,然后就出现要求验证码了,解决办法只能处理验证码或者使用代理服务器了,这部分继续加强学习再弄出来了↖(^ω^)↗
五、源代码和效果
# encoding=utf8 import MySQLdb
import re
import time from selenium import webdriver # connect mysql,get zkxh and xm
conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='cet', port=3306, charset='utf8')
cur = conn.cursor()
curr = conn.cursor()
url = 'http://www.chsi.com.cn/cet/query' def kaishi(i):
print i,
print " start"
try:
cur.execute("select name from cet.cet where zkzh=(%s)" % i)
xm = cur.fetchone()[0]
print "Name is " + xm
driver = webdriver.PhantomJS(executable_path='D:\phantomjs-2.1.1-windows\phantomjs.exe')
driver.get(url)
driver.find_element_by_id('zkzh').send_keys(i)
driver.find_element_by_id('xm').send_keys(xm)
driver.find_elements_by_tag_name('form')[1].submit()
driver.set_page_load_timeout(10)
leibie = driver.find_element_by_xpath("//tr[3]/td[1]").text
leibie2 = str(leibie.encode("utf-8"))
ss = ""
if leibie2.decode("utf-8") == '英语四级'.decode("utf-8"):
ss = 4
else:
ss = 6
# zongfen = driver.find_element_by_xpath("//tr[6]/th[1]").text
# print zongfen
# print "===="
chuli = driver.find_element_by_xpath("//tr[6]/td[1]").text
print chuli
chuli2 = str(chuli.encode("utf-8"))
m = re.findall(r'(\w*[0-9]+)\w*', chuli2)
sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % (
ss, m[0], m[1], m[2], m[3], i)
cur.execute(sqltxt)
conn.commit()
print str(i) + " finish"
except Exception, e:
print e
driver.close()
time.sleep(10)
kaishi(i) # for j1 in range(1201351511001, 1201351512154):
for j1 in range(1201351511007, 1201351512154):
for j2 in range(0, 3):
for j3 in range(0, 10):
j = str(j1) + str(j2) + str(j3)
if str(j2) + str(j3) == "":
print "0.0"
elif str(j2) + str(j3) == "":
kaishi(str(j1) + str(j2) + str(j3))
j4 = str(j1) + ""
kaishi(j4)
else:
kaishi(j)
print "END!!!"
cur.close()
conn.close()
参考资料:
1.http://my.oschina.net/u/2420420/blog/489205?fromerr=MX68uajh
2.http://www.cnblogs.com/hearzeus/p/5157016.html
总结:python的字符串处理细节真的很重要,动不动就输出错误,还有IDE的编码不一样,记得还有个系统编码,字符编码,环境编码,数据库编码等等都要一致!!!
ps后记:1.这几天别人各种同学聚会,然而,自己也总是那么“幸运”,中学所碰到的班级对外特活跃特团结的样子,但是初中高中毕业那么久了,聚会是几乎没有过。。。。昨晚梦见了那些人那些事,也不知道他们怎么样了。昨天有一篇新闻报道了一大学一宿舍毕业20年,年年聚会的那样子真好。
2.对于爱情的烦恼,莫过于明明很喜欢却发现自己和她完全不是一个“世界”的人,然后也很少找她说话,再然后就是用“嗯”“哦”来回复她的主动聊天,再然后联系越来越少,再然后连门都不敢出了,怕这个世界,有时虽然也会自嘲“活该孤独终老”,但是有啥办法呢?过年了,回到家,过着越来越淡的年,看着一同长大的人,吃着几十年一样的菜和饭,难不得矫情一下。
python动态网页爬取——四六级成绩批量爬取的更多相关文章
- 四六级成绩还可以这样查?Python助你装B一步到位!!!
昨天有很多同学在朋友圈秀六级成绩 一个个都如(sang)此(jin)优(tian)秀(liang) 当然也有悲催的哥们 对于上面这位老弟 我只能说:骚呢,兄弟 这种事都能赶上,必须点赞 一.需求分析 ...
- Python动态网页爬虫-----动态网页真实地址破解原理
参考链接:Python动态网页爬虫-----动态网页真实地址破解原理
- 【转】详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
转自:http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_ ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- python爬取动态网页数据,详解
原理:动态网页,即用js代码实现动态加载数据,就是可以根据用户的行为,自动访问服务器请求数据,重点就是:请求数据,那么怎么用python获取这个数据了? 浏览器请求数据方式:浏览器向服务器的api(例 ...
- 【Python网络爬虫四】通过关键字爬取多张百度图片的图片
最近看了女神的新剧<逃避虽然可耻但有用>,同样男主也是一名程序员,所以很有共鸣 被大只萝莉萌的一脸一脸的,我们来爬一爬女神的皂片. 百度搜索结果:新恒结衣 本文主要分为4个部分: 1.下载 ...
- scrapy 动态网页处理——爬取鼠绘海贼王最新漫画
简介 scrapy是基于python的爬虫框架,易于学习与使用.本篇文章主要介绍如何使用scrapy爬取鼠绘漫画网海贼王最新一集的漫画. 源码参见:https://github.com/liudaol ...
- R语言爬取动态网页之环境准备
在R实现pm2.5地图数据展示文章中,使用rvest包实现了静态页面的数据抓取,然而rvest只能抓取静态网页,而诸如ajax异步加载的动态网页结构无能为力.在R语言中,爬取这类网页可以使用RSele ...
- 爬虫(三)通过Selenium + Headless Chrome爬取动态网页
一.Selenium Selenium是一个用于Web应用程序测试的工具,它可以在各种浏览器中运行,包括Chrome,Safari,Firefox 等主流界面式浏览器. 我们可以直接用pip inst ...
随机推荐
- NGINX高性能Web服务器详解(读书笔记)
原文地址:NGINX高性能Web服务器详解(读书笔记) 作者:夏寥寥 第4章 Nginx服务器的高级配置 4.1 针对IPv4的内核7个参数的配置优化 说明:我们可以将这些内核参数的值追加到Linu ...
- java多线程学习
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 一.扩展java.lang.Thread类 package com.multithread.lea ...
- 重新认识mapreduce
写这篇文章,是因为最近遇到了mapreduce的二次排序问题.以前的理解不完全正确.首先看一下mapreduce的过程 相信这张图熟悉MR的人都应该见过,再来一张图 wordcount也不细说了,ha ...
- 安装Mysql 5.7.1
现在安装MySQL变成了一件非常人性化的事情,因为有了MySQL-installer这个工具,它可以帮助我们全程安装MySQL. 下面我来简单介绍一下如何使用,以供新手学习: .首先下 ...
- sql server 2005导出数据到oracle
一. 在sql server下处理需要导出的数据库 1. 执行以下sql,查出所有'float'类型的字段名,手动将float类型改为decimal(18,4). select 表名=d.name,字 ...
- 烂泥:vcenter5.5无AD下的安装与配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 公司现在的虚拟化使用的基本上都是vsphere,目前大约有7台物理机,为了更好的管理虚 ...
- 2------------NLPIR(ICTCLAS2016)分词系统添加用户词典功能
备注:win7 64位系统,netbeans编程 基本代码框架参见我的另一篇文章:NLPIR分词功能 代码实现: package cwordseg; import java.io.Unsupporte ...
- 怎么使PUTTY一直连接
如何才能保证PUTTY一直连接,即使我们好长时间不去敲命令,也让它一直连接着? PuTTY的设置方法是:在Connection里面有个Seconds between keepaliaves.这里就是每 ...
- linux 下 mysql 安装(不用编译的方式)
环境是centos6.x.相信其他的也大同小异.相对来说这种方式我用的比较多. 一些环境依赖表库: yum install perl yum install libaio 1)下载:在mysql的网站 ...
- 8、FTP,二种文本传输模式
一.基本知识 1. FTP是 TCP/IP协议族 的协议之一,简称文件传输协议,主要用于远距离文件传输,如文件的上传和下载 2. 下面都是以VSFTP服务器为例 VSFTP服务器的用户有三种形式: 匿 ...