热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python动态网页批量爬取

这篇文章主要介绍了python动态网页批量爬取的方法,主要针对四六级成绩批量爬取,感兴趣的小伙伴们可以参考一下
四六级成绩查询网站我所知道的有两个:学信网(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的编码不一样,记得还有个系统编码,字符编码,环境编码,数据库编码等等都要一致。

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

推荐阅读
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • ORACLE空间管理实验5:块管理之ASSM下高水位的影响
    数据库|mysql教程ORACLE,空间,管理,实验,ASSM,下高,水位,影响,数据库-mysql教程易语言黑客软件源码,vscode左侧搜索,ubuntu怎么看上一页,ecs搭 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • PHP函数实现分页含文本分页和数字分页【PHP】
    后端开发|php教程PHP,分页后端开发-php教程最近,在项目中要用到分页。分页功能是经常使用的一个功能,所以,对其以函数形式进行了封装。影视网源码带充值系统,vscode配置根 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • Oracle 和 mysql的9点区别【MySQL】
    数据库|mysql教程oracle,Oracle,money,mysql,coun数据库-mysql教程1.组函数用法规则mysql中组函数在select语句中可以随意使用,但在o ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
author-avatar
有一颗爱心和寂寞的心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有