Python 爬虫入门(requests)

相信最开始接触Python爬虫学习的同学最初大多使用的是urllib,urllib2。在那之后接触到了第三方库requests,requests完全能满足各种http功能,真的是好用爆了 :D

他们是这样说的:

“Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib3。”

-----来自官方文档(http://cn.python-requests.org/zh_CN/latest/)

敲入命令“Pip Install Requests”安装即可享用(前提是已经安装了pip)

还等什么呢?赶紧import requests加入豪华午餐吧

先看看几个常用的方法和属性:

  1.requests.Session()这样就可以在会话中保留状态,保持cookie等

  2.requests.get()获取某个网页,get时你可以使用params参数发送一些数据过去

d = {key1 : value1, key2 : value2 }
requests.get(‘URL’, params=d)

  get时也可以使用headers参数定制请求头。

h = {key1 : value1, key2 : value2 }
requests.get(‘URL’, headers=d)

  3.requests.post()发送post请求,类似的,post时也可以发送数据(使用data参数)和定制请求头(使用headers参数)。

一些常用的属性:

eg=requests.get()
eg.text  #可以获取响应的内容如抓回来的网页
eg. encoding=‘utf-8‘  #有时回来的是乱码,改变编码以使其正常显示根据实际情况改变编码utf-8、gb2312等
eg. content  #可以获取二进制内容,如抓取登陆时的验证码等非字符资源
eg.cookies  #可以查看当前保存的cookie情况
eg. status_code  #可以查看HTTP状态码(如200 OK、404 Not Found等)
eg.url  #可以查看当前请求的网址

其他详细内容参见官方文档(http://cn.python-requests.org/zh_CN/latest/)

好了,其实只要懂那么一点点就可以进行爬虫之旅了。

一个有趣的现象:童鞋们在学习爬虫时都会去爬一个叫做“教务处”的网站,哈哈。那这里的小爬虫也是以登陆本校(成都信息工程大学)的教务处作为实例

首先使用浏览器打开教务处,按F12打开“开发人员工具”,进行一次正常的登陆,对登陆的数据进行分析。

  1.教务处的登陆页面为http://210.41.224.117/Login/xLogin/Login.asp

  2.在开发者工具中点击网络,经查看登陆的发送post数据的地址也是http://210.41.224.117/Login/xLogin/Login.asp

  3.同时看到post的数据包括如下


参数列表


表单名



说明


WinW


1366


屏幕分辨率-宽


WinH


728


屏幕分辨率-高


txtId


2013215042


学号


txtMM


123456


密码


verifycode


123a


验证码


codeKey


597564


动态登陆码,html文件中可见


Login


Check


登陆类型(固定)


IbtnEnter.x


10


登陆按钮点击位置


IbtnEnter.y


10


登陆按钮点击位置

“开发者工具”中的登陆post表单数据:

  4.其中codeKey在登陆页载入时可以在页面中获得(使用正则表达式获取)。

那么思路来了:

  1.get()载入登陆页

  2.在载入页中获取codeKey和验证码

  3.使用post()将登陆学号、密码、验证码等参数发送过去

  4.登陆成功。

然而事实并不是如此顺利,经以上思路登陆之后会返回“LoginOK!”登陆成功的消息,本来是要经两个302跳转到教务处的学生主页的,但并不能顺利跳转而且哪怕手动加载学生页不行。

经再次分析发现从教务处首页点击登陆链接并不是直接链接到登陆页http://210.41.224.117/Login/xLogin/Login.asp,而是先访问http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp试图打开学生页失败,再经跳转到一个http://210.41.224.117/Login/qqLogin.asp?Oid=jxgl.cuit.edu.cn&OSid=*********再经这里跳转才到登陆页,其中的OSid为服务器下发分配的。实践表明我需要模仿这个过程才能顺利登陆成功。

好了,那么思路再次来了:

  1. get(‘http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp’)这里要get两次才能跳转到登陆页
  2. 在载入的登陆页中获取codeKey和验证码
  3. 使用post()将登陆学号、密码、验证码等参数发送过去
  4. 登陆成功,加载学生主页

要点:

  1. 两次get()之后得到一个跳转页面由浏览器执行javascript自动跳转,但在爬虫里需要在这个页面中找出跳转的地址手动跳转过去。使用正则表达式在javascript代码中获取需要跳转的网址,再get该网址即可。
  2. 获取验证码,验证码是随机生成的,得到验证码刷新地址http://210.41.224.117/Login/xLogin/yzmDvCode.asp?k=597564&t=1471855009329其中参数k为codeKey,t为时间戳加上三位随机数。那就使用前边提到eg. content可以获取二进制内容将图片保存下来再打开人工识别后输入验证码。

思考完毕,接下来就是实现了,最后的登陆代码如下:

#coding=utf-8
import requests
import re
import time
import random
from PIL import Image
import cStringIO
def login(username,password):
    headers = {     #请求头请求刷新验证码和发送post时需要使用
        ‘Host‘: ‘210.41.224.117‘,
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0‘,
        ‘Accept‘: ‘*/*‘,
        ‘Accept-Language‘: ‘zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3‘,
        ‘Accept-Encoding‘: ‘gzip, deflate‘,
        ‘Referer‘: ‘http://210.41.224.117/Login/xLogin/Login.asp‘,
        ‘Connection‘: ‘keep-alive‘
    }
    session = requests.Session()
    step1 = session.get(‘http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp‘) #连get两次学生主页以跳转至登陆页
    step1 = session.get("http://jxgl.cuit.edu.cn/Jxgl/Xs/MainMenu.asp")
    get_osid_url = re.compile(r‘content="0;URL=(.*?)">‘) #获取含OSid的跳转网址
    osid_url = get_osid_url.findall(step1.text)
    step2 = session.get(osid_url[0])    #跳转,上文要点1
    get_codeKey = re.compile(r‘var codeKey = \‘(.*?)\‘;‘)   #在登陆页html中获取codeKey(参数k)
    codeKey = get_codeKey.findall(step2.text)
    timeKey = str(time.time())[:10] + str(random.randint(100, 999)) #生成参数t的值(时间戳+三位随机数)
    payload = {‘k‘: codeKey[0], ‘t‘: timeKey}
    yzm_url=‘http://210.41.224.117/Login/xLogin/yzmDvCode.asp‘
    yzmdata = session.get(yzm_url, params=payload, headers=headers)  #刷新验证码,上文要点2
    tempIm = cStringIO.StringIO(yzmdata.content)
    im = Image.open(tempIm)
    im.show()
    yzm = raw_input(‘please enter yzm: ‘)   #人工识别验证码后输入
    post_data = {
        ‘WinW‘: ‘1366‘,
        ‘WinH‘: ‘728‘,
        ‘txtId‘: username,
        ‘txtMM‘: password,
        ‘verifycode‘: yzm,
        ‘codeKey‘: codeKey[0],
        ‘Login‘: ‘Check‘,
        ‘IbtnEnter.x‘: 10,
        ‘IbtnEnter.y‘: 10
    }
    post_url=‘http://210.41.224.117/Login/xLogin/Login.asp‘
    step3 = session.post(post_url, data=post_data, headers=headers)   #post登陆数据
    return session

cuitJWC=login(‘username‘,‘password‘)
con=cuitJWC.get(‘http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp‘)
con.encoding=‘gb2312‘
print con.text

转载请注明出处:http://www.cnblogs.com/lucky-pin/p/5806394.html

时间: 2024-08-27 05:21:51

Python 爬虫入门(requests)的相关文章

1.Python爬虫入门一之综述

要学习Python爬虫,我们要学习的共有以下几点: Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy Python爬虫更高级的功能 1.Python基础学习 首先,我们要用Python写爬虫,肯定要了解Python的基础吧,万丈高楼平地起,不能忘啦那地基,哈哈,那么我就分享一下自己曾经看过的一些Python教程,小伙伴们可以作为参考. 1) 慕课网Python教程 曾经有一些基础的语法是在慕课网上看的,上面附有一些

Python爬虫入门教程:博客园首页推荐博客排行的秘密

1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首页的推荐博客排行时,心里痒痒的,想想看看这些大佬究竟是写了什么文章这么受欢迎,可以被推荐.所以用Python抓取了这100位推荐博客,简单分析了每个博客的文章分类,阅读排行榜,评论排行榜及推荐排行榜,最后统计汇总并生成词云.正好这也算是一篇非常好的Python爬虫入门教程了. 2. 环境准备 2.1

Python爬虫入门 | 爬取豆瓣电影信息

这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬虫的大门啦~好啦,正式开始我们的第二节课<爬取豆瓣电影信息>吧!啦啦哩啦啦,都看黑板~1. 爬虫原理1.1 爬虫基本原理听了那么多的爬虫,到底什么是爬虫?爬虫又是如何工作的呢?我们先从"爬虫原理"说起.爬虫又称为网页蜘蛛,是一种程序或脚本.但重点在于:它能够按照一定的规则,自动

Python 爬虫入门(二)——爬取妹子图

Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob/master/%E7%88%AC%E8%99%AB%E9%9B%86%E5%90%88/meizitu.py 公众号:[智能制造专栏].欢迎关注,分享智能制造与编程那些事. 爬虫成果 当你运行代码后,文件夹就会越来越多,如果爬完的话会有2000多个文件夹,20000多张图片.不过会很耗时间,可以在

Python 爬虫入门之爬取妹子图

Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob/master/%E7%88%AC%E8%99%AB%E9%9B%86%E5%90%88/meizitu.py 爬虫成果 当你运行代码后,文件夹就会越来越多,如果爬完的话会有2

Python爬虫入门七之正则表达式

在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我

转 Python爬虫入门七之正则表达式

静觅 » Python爬虫入门七之正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就易如反掌了. 正则表达式的大致匹配过程是:1.依次拿出表达式和文本中的字符比较,2.如果每一个

Python爬虫入门六之Cookie的使用

大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了. 在此之前呢,我们必须先介绍一个opener的概念. 1.Opener 当你获取一个

(原)python爬虫入门(2)---排序爬取的辽宁科技大学热点新闻

发现科大网页的源码中还有文章的点击率,何不做一个文章点击率的降序排行.简单,前面入门(1)基本已经完成我们所要的功能了,本篇我们仅仅需要添加:一个通过正则获取文章点击率的数字:再加一个根据该数字的插入排序.ok,大功告成! 简单说一下本文插入排序的第一个循环,找到列表中最大的数,放到列表 0 的位置做观察哨. 上代码: # -*- coding: utf-8 -*- # 程序:爬取点击排名前十的科大热点新闻 # 版本:0.1 # 时间:2014.06.30 # 语言:python 2.7 #--

转 Python爬虫入门二之爬虫基础了解

静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以及百度搜索框,这个过程其实就是用户输入网址之后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器 HTML.JS.CSS 等文件,浏览器解析出来,用户便可以看到形形色色的图片了. 因此,用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容