动态网页爬取

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

网站的代码如下:

  1. 1 <form method="get" name="form1" id="form1" action="/cet/query">
  2. 2
  3. 3 <table border="0" align="center" cellpadding="0" cellspacing="0">
  4. 4 <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>
  5. 5 <td align="left" class="font12 color666">请输入15位准考证号</td>
  6. 6 </tr>
  7. 7 <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>
  8. 8 <td align="left" class="font12 color666">姓名超过3个字,可只输入前3个</td>
  9. 9 </tr>
  10. 10
  11. 11 <tr><td align="center">&nbsp;</td>
  12. 12 <td colspan="2" align="left"><input type="submit" id="submitCET" class="btn_blue" value="查询" /></td>
  13. 13 </tr>
  14. 14 </table>
  15. 15 </form>

由图中可以看出表单提交的链接为/cet/query,即:http://www.chsi.com.cn/cet/query,好了,填写表单和结果如下:

                     

但是,点击查看源代码之后发现,没有成绩,即代码仍是上面那个,之后按F12查看代码:

  1. 1 <TBODY><TR>
  2. 2 <TH>姓名:</TH>
  3. 3 <TD>XXXX</TD></TR>
  4. 4 <TR>
  5. 5 <TH>学校:</TH>
  6. 6 <TD>XXXXXX</TD></TR>
  7. 7 <TR>
  8. 8 <TH>考试类别:</TH>
  9. 9 <TD>英语四级</TD></TR>
  10. 10 <TR>
  11. 11 <TH>准考证号:</TH>
  12. 12 <TD>120135151100101</TD></TR>
  13. 13 <TR>
  14. 14 <TH>考试时间:</TH>
  15. 15 <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

  

  1. 1 from selenium import webdriver
  2. 2
  3. 3 driver = webdriver.PhantomJS(executable_path=‘D:\phantomjs-2.1.1-windows\phantomjs.exe‘)
  4. 4 driver.get(url)
  5. 5 driver.find_element_by_id(‘zkzh‘).send_keys(i)
  6. 6 driver.find_element_by_id(‘xm‘).send_keys(xm)
  7. 7 driver.find_elements_by_tag_name(‘form‘)[1].submit()

  代码说明:

  3.selenium可以加载很多驱动,比如Chrome、FireFox等,这里需要有这两个浏览器和驱动才行,折腾了一下,网上说Phantomjs是较好的了

  5、6、7分别是准考证号,姓名和提交

二、字符处理

提交之后就可以直接查找了:

  1. 1 print driver.find_element_by_xpath("//tr[3]/td[1]").text
  2. 2 print driver.find_element_by_xpath("//tr[6]/td[1]").text

  代码说明:

  1.查看姓名

  2.查看分数及其具体成绩

  打印之后为:

  1. 姓名
  2. 403
  3. 听力
  4. 132
  5. 阅读
  6. 147
  7. 写作
  8. 142

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

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

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

三、数据库

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

数据库代码如下:

  1. 1 import MySQLdb
  2. 2
  3. 3 conn = MySQLdb.Connect(host=‘localhost‘, user=‘root‘, passwd=‘root‘, db=‘cet‘, port=3306, charset=‘utf8‘)
  4. 4 cur = conn.cursor()
  5. 5 curr = conn.cursor()
  6. 6 cur.execute("select name from cet.cet where zkzh=(%s)" % i)
  7. 7 xm = cur.fetchone()[0]
  8. 8 print "Name is " + xm
  9. 9 sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % (
  10. 10 ss, m[0], m[1], m[2], m[3], i)
  11. 11 cur.execute(sqltxt)
  12. 12 conn.commit()
  13. 13 cur.close()
  14. 14 conn.close()

  代码说明:

  3.python连接数据库代码

  6.连接数据库取得姓名部分

  9.这行我好无语啊,使用‘“+ss+”’这样的写法一直报错,最终找了半天资料,这个写法我不太喜欢,但是凑合着用吧。

  12.记得一定要提交事务!!!commit()!!!不然是没有效果的

四、使用代理服务器(保留以后写)

  运行了一段时间之后,大概抓了几百人的吧,然后就出现要求验证码了,解决办法只能处理验证码或者使用代理服务器了,这部分继续加强学习再弄出来了(^ω^)

五、源代码和效果

  1. 1 # encoding=utf8
  2. 2
  3. 3 import MySQLdb
  4. 4 import re
  5. 5 import time
  6. 6
  7. 7 from selenium import webdriver
  8. 8
  9. 9 # connect mysql,get zkxh and xm
  10. 10 conn = MySQLdb.Connect(host=‘localhost‘, user=‘root‘, passwd=‘root‘, db=‘cet‘, port=3306, charset=‘utf8‘)
  11. 11 cur = conn.cursor()
  12. 12 curr = conn.cursor()
  13. 13 url = ‘http://www.chsi.com.cn/cet/query‘
  14. 14
  15. 15
  16. 16 def kaishi(i):
  17. 17 print i,
  18. 18 print " start"
  19. 19 try:
  20. 20 cur.execute("select name from cet.cet where zkzh=(%s)" % i)
  21. 21 xm = cur.fetchone()[0]
  22. 22 print "Name is " + xm
  23. 23 driver = webdriver.PhantomJS(executable_path=‘D:\phantomjs-2.1.1-windows\phantomjs.exe‘)
  24. 24 driver.get(url)
  25. 25 driver.find_element_by_id(‘zkzh‘).send_keys(i)
  26. 26 driver.find_element_by_id(‘xm‘).send_keys(xm)
  27. 27 driver.find_elements_by_tag_name(‘form‘)[1].submit()
  28. 28 driver.set_page_load_timeout(10)
  29. 29 leibie = driver.find_element_by_xpath("//tr[3]/td[1]").text
  30. 30 leibie2 = str(leibie.encode("utf-8"))
  31. 31 ss = ""
  32. 32 if leibie2.decode("utf-8") == ‘英语四级‘.decode("utf-8"):
  33. 33 ss = 4
  34. 34 else:
  35. 35 ss = 6
  36. 36 # zongfen = driver.find_element_by_xpath("//tr[6]/th[1]").text
  37. 37 # print zongfen
  38. 38 # print "===="
  39. 39 chuli = driver.find_element_by_xpath("//tr[6]/td[1]").text
  40. 40 print chuli
  41. 41 chuli2 = str(chuli.encode("utf-8"))
  42. 42 m = re.findall(r‘(\w*[0-9]+)\w*‘, chuli2)
  43. 43 sqltxt = "update cet.cet set leibie=(%s),zongfen=(%s),tingli=(%s),yuedu=(%s),xiezuo=(%s) WHERE zkzh=(%s)" % (
  44. 44 ss, m[0], m[1], m[2], m[3], i)
  45. 45 cur.execute(sqltxt)
  46. 46 conn.commit()
  47. 47 print str(i) + " finish"
  48. 48 except Exception, e:
  49. 49 print e
  50. 50 driver.close()
  51. 51 time.sleep(10)
  52. 52 kaishi(i)
  53. 53
  54. 54
  55. 55 # for j1 in range(1201351511001, 1201351512154):
  56. 56 for j1 in range(1201351511007, 1201351512154):
  57. 57 for j2 in range(0, 3):
  58. 58 for j3 in range(0, 10):
  59. 59 j = str(j1) + str(j2) + str(j3)
  60. 60 if str(j2) + str(j3) == "00":
  61. 61 print "0.0"
  62. 62 elif str(j2) + str(j3) == "29":
  63. 63 kaishi(str(j1) + str(j2) + str(j3))
  64. 64 j4 = str(j1) + "30"
  65. 65 kaishi(j4)
  66. 66 else:
  67. 67 kaishi(j)
  68. 68 print "END!!!"
  69. 69 cur.close()
  70. 70 conn.close()

时间: 2024-08-05 08:30:15

动态网页爬取的相关文章

动态网页爬取例子(WebCollector+selenium+phantomjs)

目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test"></div>,通过JS生成<div id="test"><span>aaa</span></div>. 这里用了WebCollector 2进行爬虫,这东东也方便,不过要支持动态关键还是要靠另外一个API -- selen

python动态网页爬取——四六级成绩爬取

需求: 四六级成绩查询网站我所知道的有两个:学信网(http://www.chsi.com.cn/cet/)和99宿舍(http://cet.99sushe.com/),这两个网站采用的都是动态网页.我使用的是学信网,好了,网站截图如下: 网站的代码如下: 1 <form method="get" name="form1" id="form1" action="/cet/query"> 2 3 <table

动态网页爬取样例(WebCollector+selenium+phantomjs)

目标:动态网页爬取 说明:这里的动态网页指几种可能:1)须要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成.如一个html里有<div id="test"></div>,通过JS生成<div id="test"><span>aaa</span></div>. 这里用了WebCollector 2进行爬虫,这东东也方便,只是要支持动态关键还是要靠另外一个API -- selen

WebFetch 是无依赖极简网页爬取组件

WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api接口 能在Android设备上稳定运行 小巧灵活可以方便集成的网页抓取组件 使用文档 WebFetch的使用非常简单,让小白用户快速上手,WebFetch为用户配置默认页面处理方法,默认将抓取到的页面信息使用System.out.print输出到控制台(通过配置PageHandler修改默认操作).

Python开发爬虫之动态网页抓取篇:爬取博客评论数据

以爬取<Python 网络爬虫:从入门到实践>一书作者的个人博客评论为例.网址:http://www.santostang.com/2017/03/02/hello-world/ 1)"抓包":找到真实的数据地址 右键点击"检查",点击"network",选择"js".刷新一下页面,选中页面刷新时返回的数据list?callback....这个js文件.右边再选中Header.如图: 其中,Request URL即

网络爬虫之动态内容爬取

根据联合国网站可访问性审计报告,73%的主流网站都在其重要功能中依赖JavaScript.和单页面应用的简单表单事件不通,使用JavaScript时,不再是加载后立即下载所有页面内容.这样会造成许多网页在浏览其中展示的内容不会出现在HTML源码中,针对于这种依赖于JavaScript的动态网站,我们需要采取相应方法,比如JavaScript逆向工程.渲染JavaScript等方法. 1. 动态网页示例 如上图,打开智联招聘主页,输入python,搜索会出现上面的页面,现在我们爬取上图红色标记出的

使用selenium动态渲染爬取拉勾网上450个java职位的信息

开始这个小项目的时候要确保你的电脑中有装上selenium以及相应的浏览器驱动,还有别忘了Mongodb数据库 我们首先打开拉勾网的官网查看下基本的页面元素 当我在搜索框中输入java的时候,url如下,当我想用下面的url进行抓取的时候,我发现事情并不简单. 我点击下一页的时候发现,url并没有变化,所以并不能用最基本的抓取方法了,而改为ajax请求进行抓取 当我查看ajax请求的时候,发现事情又不简单的了,这个分页的请求带的参数时Form data,也就是表单形式的参数, 所以,拉勾网上的a

用python进行网页爬取,数据插入数据库

用python进行网页信息的爬取还是很简单的,而且现在进行爬取的 在爬取之前,确定好自己的网页,然后用F12(查看网页源代码,然后确定网页的),这里就以一个简单的,页面布局简单的页面进行讲解:http://jbk.39.net/yyz/jbzs/ 先来看下页面的布局,以及我们想要进行页面的信息: 就这个页面,我们想要从这里面将页面中的疾病的名称,还有就是疾病的介绍,以及疾病的基本信息(是否属于医保.别名.发病部位.传染性...) 代码很简单: #!/usr/bin/env python # co

妹子图数网页爬取

任务:将妹子图首页展示的200多页数据全部爬取下来 在爬取的过程中,需要用到requests库来获取网页 使用bs库来解析网页 随后将图片以图集的形式保存到文件汇总 首先是获取所有图集url的函数 import requests from bs4 import BeautifulSoup as bs import threading import time import os def get_base_url(): """ 获取妹子图的所有图集url,并返回url组成的列表