python动态网页批量爬取
admin
2023-07-31 02:32:23
0

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

                  

网站的代码如下:

准考证号: 请输入15位准考证号
姓名: 姓名超过3个字,可只输入前3个
 

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

                         

 

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


姓名:
XXXX

学校:
XXXXXX

考试类别:
英语四级

准考证号:
120135151100101

考试时间:
2015年06月总分:403 
听力: 132
阅读: 147
写作与翻译: 124

该代码显示了成绩,可以知道,该网站使用的是动态网页,用的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连接部分。

 数据库代码如下:

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的字符串处理细节真的很重要,动不动就输出错误,还有IDE的编码不一样,记得还有个系统编码,字符编码,环境编码,数据库编码等等都要一致。

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

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...