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面向对象编程中的类和对象学习教程
Mar 30 Python
Python实现的最近最少使用算法
Jul 10 Python
解析Python编程中的包结构
Oct 25 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
使用Flask集成bootstrap的方法
Jul 24 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
如何安装并使用conda指令管理python环境
Jul 10 Python
Python中拆分字符串的操作方法
Jul 23 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
Python线程条件变量Condition原理解析
Jan 20 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 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来检测proxy
2006/10/09 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
Python数据正态性检验实现过程
2020/04/18 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
社区包粽子活动方案
2014/01/21 职场文书
学习三严三实心得体会
2014/10/13 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
Java实现多文件上传功能
2021/06/30 Java/Android
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL