女神找我倾诉,实验室实验选不上,刚出来就被秒了,让我帮她选实验,我想我这万年单身的手速估计还是抢不过我这些师兄们,干脆写一个脚本吧,这样以后女神就找我选实验了,废话少说,切入主题,看这篇教程首先得保证你有Python基础,我尽量会写的通俗易懂,记录下思考的整个过程。

先来看一个简单的爬虫脚本

先不要想这个复杂的功能,我们想想能不能用Python浏览一个网页,就从最简单的抓取百度主页开始。PS:要用Python3哦~

import urllib.requesturl = "http://www.baidu.com"
data = urllib.request.urlopen(url)
print(data.read().decode('UTF-8'))

上述代码的输出就是百度主页的html代码,对于爬虫的类库,不懂直接可以套用,这里我来解释一下编码的问题,看你需要爬的网页源码,Google浏览器右键检查,开头会有<meta charset="***">其中*就是网页的编码方式,因为Python内部使用unicode编码,所以要转为网页编码方式。


深入一点-模拟登陆

现在正式切入我们要实现的脚本,模拟登陆网站,然后模拟提交数据。先大概解释一下流程,我们登陆网站时,输入账号密码,网站会给浏览器发送一个cookie的东西,浏览器下次访问网页时,会将这个cookie发送给服务器,服务器就会知道是谁访问它了,所以我们模拟的时候,最关键的就是把这个cookie存起来。先看源码:

import urllib.request
import http.cookiejar
import urllib.parsepostData = {'username': '***','pass': '***','password': '***'}url = '***'cookie = http.cookiejar.CookieJar()
openner = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
headers = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
request = urllib.request.Request(url, urllib.parse.urlencode(postData).encode(), headers)
r = openner.open(request)
print(r.read().decode('UTF-8'))

为了避嫌,这里我讲网页链接去掉,注意到账号和密码是保存在postData的字典中,还需要header参数,其他都是固定写法,没什么好解释的,下面我主要说明这postData和header参数是怎么构造的。

用Google浏览器打开你要登陆的网页,右键检查,点network选项

输入账号和密码,点登陆,这时候可以看到右侧抓取了内容,我们点第一个,点击就OK

现在可以看到我们构建的postData和header是从哪里来的了吧,postData的内容要保证一样,header可以不用全部构建,一般构建User-Agent和Referer就够了,如果你还爬不进去,不妨再加点别的参数试试。


更进一步-模拟post提交参数

经过上面的步骤,相信我们都可以登录进入网页了,下面我们要做的就是如何自动的填写参数,然后提交到网站上去。先看这部分的代码实现:

exUrl = "http://atc.hust.edu.cn:8080/lioms4hz/order/load?id=5"
exPostData = {'proSource': '111','proNum': '111','proName': '111','sampleName': '111','sampleCount': '111','sampleDetail': '111','sampleImg': '','dpId': '50','testDate': '2017-04-17','startTime': '14:00:00','endTime': '16:00:00','startTime1': '','endTime1': '','startTime2': '','endTime2': '','remarks': '111','uiid': '1784','diid': '5','parentid': '154','duser': '474','query': '1'}
exheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36','Referer': '***','Origin': '***'}
exRequest = urllib.request.Request(exUrl, urllib.parse.urlencode(exPostData).encode(), exheaders)
exr = openner.open(exRequest)
response = exr.read().decode('UTF-8')

对于post的数据和header的参数的选择,经过上述的步骤相信都可以解决了,这里要注意的时,我们再次访问网站的时候需要要来的cookie,exr = openner.open(exRequest) 这一行代码可以保证将原来保存的cookie再次提交到网站。


总结

OK!写到这里,相信大部分人可以完成一个简单的爬虫程序了,当然爬虫的功能不仅仅局限于这里,当获取一个网页的html源码时,我们可以利用正则表达式,获取对我们有用的信息,从而可以完成更加复杂的功能。

将实现的整个代码上传到服务器上,再服务器安装Python3,可以利用crontab定时任务定时执行我们的脚本,比如说女神的实验是晚上9点开始选,那我们可以设定9点开始执行,命令如下:

[root@localhost ~]# crontab -e
0 21 * * * /bin/python3 /home/test.py > /home/test.log

crontab具体的配置过程可以看我的另一篇博客
http://blog.csdn.net/hxl_1993/article/details/52024943

下面帖出我实现的整个代码,为了保证万无一失,脚本从8点59开始执行,成功选上实验或者执行2分钟后退出。


import urllib.request
import http.cookiejar
import urllib.parse
import re
import datetimepostData = {'username': '***','pass': '***','password': '***'}url = '***'cookie = http.cookiejar.CookieJar()
openner = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
headers = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
request = urllib.request.Request(url, urllib.parse.urlencode(postData).encode(), headers)
r = openner.open(request)
# print(r.read().decode('UTF-8'))exUrl = "***"
exPostData = {'proSource': '111','proNum': '111','proName': '111','sampleName': '111','sampleCount': '111','sampleDetail': '111','sampleImg': '','dpId': '50','testDate': '2017-04-17','startTime': '14:00:00','endTime': '16:00:00','startTime1': '','endTime1': '','startTime2': '','endTime2': '','remarks': '111','uiid': '1784','diid': '5','parentid': '154','duser': '474','query': '1'}
exheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36','Referer': '***','Origin': '***'}flag = True
noPattern = re.compile("class=\"alert fade in alert-danger\".*?抱歉", re.S)
start = datetime.datetime.now()
end = datetime.datetime.now()
# 如果失败发起多次请求
while flag and (end-start).seconds < 120:end = datetime.datetime.now()try:exRequest = urllib.request.Request(exUrl, urllib.parse.urlencode(exPostData).encode(), exheaders)exr = openner.open(exRequest)response = exr.read().decode('UTF-8')flag = FalsenoStr = noPattern.findall(response)if noStr:print('no')else:print('yes')except urllib.error.URLError as e:flag = Trueprint(e.code, ':', e.reason)open('index.html', 'w', encoding='UTF-8').write(response)

Python爬虫之模拟登陆相关推荐

  1. python爬虫(一):模拟登陆微博

    最近花了不少时间来学python爬虫,觉得还是有很多问题的,比如说requests.get获得Pixiv的网页源代码,一直获取不到,不过我猜测大概是headers的问题,准备之后处理. 废话少说我们先 ...

  2. Python爬虫——Cookie模拟登录

    文章目录 Python爬虫--Cookie模拟登录 1.Cookie模拟登录 2.Handler处理器 Python爬虫--Cookie模拟登录 1.Cookie模拟登录 现在很多网站需要用户成功登录 ...

  3. python项目实战:模拟登陆CSDN

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练 ...

  4. 湖南工业大学教务系统爬虫(模拟登陆篇)

    湖南工业大学教务系统爬虫(模拟登陆篇) 之前写了一个教务系统的爬虫程序,可以根据用户要求爬取任何一部分的数据,也可以模拟提交数据,可能这也是部分工大计算机学生比较感兴趣的,所以今天就在这分享一下整个的 ...

  5. Python网络爬虫之模拟登陆

    为什么要模拟登陆 Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面. 保存用户信息 ...

  6. python爬虫怎么登录_Python爬虫基础-模拟登陆

    为什么我们要让爬虫模拟登陆呢?有些内容只有登陆才能进行爬取,如知乎,不登录的主页只能看到注册和登陆 : 你想爬取自己的个人信息 有什么方法呢?cookie 在互联网发展的早期,由于大家的服务器都不是太 ...

  7. python 模拟登陆智联_Python+scrapy爬虫之模拟登陆

    一.126,163邮箱模拟登陆 # -*- coding:utf-8 -*-import timefrom selenium import webdriverdef login126_or_163em ...

  8. socket模拟http的登陆_Python网络爬虫之模拟登陆 !

    为什么要模拟登陆? Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面. 保存用户信息 ...

  9. Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

    登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://kyfw.12306.cn/otn/resources/login.html 实现目标:模拟登陆中国铁路12306,攻 ...

最新文章

  1. java 获取sqlsession_获取Java的MyBatis框架项目中的SqlSession的方法
  2. Android中实现日期时间选择器(DatePicker和TimePicker)
  3. TensorFlow学习笔记(十三)TensorFLow 常用Optimizer 总结
  4. html支持的脚本语言,能不能让日志内容在支持html语言的同时支持一下脚本语言,拜托!拜托!...
  5. 拖动卡顿_教你4招,让你的ps永不卡顿
  6. SQL2000升级到2005过程中的用户和登录名问题
  7. springmvc上传图片后显示损毁或不能显示_猿蜕变系列7——也说说springMVC上传姿势...
  8. mysql还原数据库非常慢_mysql还原数据库慢
  9. 怎么选最快dns服务器,dns设置(dns设置哪个最好最快)
  10. 应用MATLAB求解线性代数题目(五)——特征值与特征向量
  11. html5 自动设置全屏,HTML5 body如何设置自适应全屏 HTML5 body设置自适应全屏代码
  12. CF417D--- Cunning Gena(序列+像缩进dp)
  13. BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)
  14. A级学科计算机技术,全国学科评估结果出炉 四川高校这些学科进入全国A档
  15. 实现电路阻抗匹配的两个方法
  16. 六、图(上):六度空间
  17. 『边城』: 陌上花开,可缓缓归矣
  18. TCP为什么连接建立需要三次握手,而不是两次握手?
  19. deepin启动盘制作工具_YUMI——多重引导制作工具
  20. 【自然语言处理(NLP)】基于ERNIE语言模型的文本语义匹配

热门文章

  1. Linux高级路由---策略路由/捆绑/网桥
  2. SPI器件的菊链配置
  3. c++编程 设置桌面壁纸以及设置壁纸失效的解决办法
  4. dpdk对虚拟化支持研究
  5. 第四十章 Caché 变量大全 $ZREFERENCE 变量
  6. Vue取得URL参数
  7. IM开发干货分享:网易云信IM客户端的聊天消息全文检索技术实践
  8. 将数字1到9填入下面圆圈里,每个数字只使用一次,使得三角形三条边之和相等
  9. 能力开放平台系列-概述
  10. android 游戏语言设置在哪里设置中文版,使命召唤手游语言变更方法 怎么设置中文...