python动态网页批量爬取


Posted in Python onFebruary 14, 2016

四六级成绩查询网站我所知道的有两个:学信网(http://www.chsi.com.cn/cet/)和99宿舍(http://cet.99sushe.com/),这两个网站采用的都是动态网页。我使用的是学信网,好了,网站截图如下:

python动态网页批量爬取                  

网站的代码如下:

<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,好了,填写表单和结果如下:

                         python动态网页批量爬取

 python动态网页批量爬取

但是,点击查看源代码之后发现,没有成绩,即代码仍是上面那个,之后按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.查看分数及其具体成绩

打印之后为:

姓名
听力
阅读
写作

之后要对分数进行字符串处理,选取各部分的数字,这里我们采用re模块:

import re
m = re.findall(r'(\w*[0-9]+)\w*', chuli2)

其中m是数组,输出的是["403","132","147","142"]

三、数据库

我们学校也不知说很渣还是人性化,反正公布了全校的四六级准考证号,当然,是excel的,需要导入mysql数据库,打开Excel之后,我发现微软大法和Oracle真是牛,Excel365居然有mysql workbench连接部分。

python动态网页批量爬取

 数据库代码如下:

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) == "00":
  print "0.0"
  elif str(j2) + str(j3) == "29":
  kaishi(str(j1) + str(j2) + str(j3))
  j4 = str(j1) + "30"
  kaishi(j4)
  else:
  kaishi(j)
print "END!!!"
cur.close()
conn.close()

python动态网页批量爬取

总结:python的字符串处理细节真的很重要,动不动就输出错误,还有IDE的编码不一样,记得还有个系统编码,字符编码,环境编码,数据库编码等等都要一致。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Python 相关文章推荐
python定时器使用示例分享
Feb 16 Python
Python装饰器使用示例及实际应用例子
Mar 06 Python
Python中endswith()函数的基本使用
Apr 07 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
Numpy之文件存取的示例代码
Aug 03 Python
Python3实现计算两个数组的交集算法示例
Apr 03 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
python利用opencv实现颜色检测
Feb 23 Python
matplotlib阶梯图的实现(step())
Mar 02 Python
Python ftp上传文件
Feb 13 #Python
Python cx_freeze打包工具处理问题思路及解决办法
Feb 13 #Python
Python批量创建迅雷任务及创建多个文件
Feb 13 #Python
Python 中 Meta Classes详解
Feb 13 #Python
教大家使用Python SqlAlchemy
Feb 12 #Python
理解Python垃圾回收机制
Feb 12 #Python
一步步解析Python斗牛游戏的概率
Feb 12 #Python
You might like
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
php教程之phpize使用方法
2014/02/12 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
python比较两个列表大小的方法
2015/07/11 Python
Python网络编程详解
2017/10/31 Python
Python单元和文档测试实例详解
2019/04/11 Python
python 制作简单的音乐播放器
2020/11/25 Python
美国老牌主机服务商:iPage
2016/07/22 全球购物
给分销商的致歉信
2014/01/14 职场文书
财务总经理岗位职责
2014/02/16 职场文书
销售内勤岗位职责
2014/04/15 职场文书
家长对孩子的评语
2014/04/18 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
Python实现简繁体转换
2021/06/07 Python
4种方法python批量修改替换列表中元素
2022/04/07 Python