爬虫供给库,21天创制布满式爬虫

作者: 网络编程  发布:2019-12-23

 1.5.Request爬去拉勾网职位消息

Request类的参数

class Request:

    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):

爬去拉钩网职位消息

智联招徕约请的职位音讯是在Ajax.json里面

图片 1

 

 代码:

#利用Request类爬去拉勾网职位信息

from urllib import request,parse

url = "https://www.lagou.com/jobs/positionAjax.json?city=北京&needAddtionalResult=false"

#请求头
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
    "Referer":"https://www.lagou.com/jobs/list_python?city=北京&cl=false&fromSearch=true&labelWords=&suginput="
}
#post请求需要提交的数据
data = {
    'first':'true',
    'pn':1,
    'kd':'python'
}
#post请求的data数据必须是编码后的字节类型
req = request.Request(url,headers=headers,data=parse.urlencode(data).encode('utf-8'),method='POST')   #建立一个请求对象
res = request.urlopen(req)
#获取的信息是字节类型,需要解码
print(res.read().decode('utf-8'))

响应Response

  response是响应音讯,具体性质如下

import requests
respone=requests.get('http://www.jianshu.com')
# respone属性
print(respone.text)   #包含html内容的字符串
print(respone.content)#bytes类型的字符串

print(respone.status_code)#状态码200
print(respone.headers)    #请求头信息
print(respone.cookies)    #COOKIE对象
print(respone.cookies.get_dict())#封装了cookie参数的字典{'locale': 'zh-CN'}

print(respone.cookies.items())#封装了cookie参数的列表[('locale', 'zh-CN')]

print(respone.url)#url地址https://www.jianshu.com/
print(respone.history)

print(respone.encoding)#编码utf-8

#关闭:response.close()
from contextlib import closing
with closing(requests.get('xxx',stream=True)) as response:
    for line in response.iter_content():
    pass#将内容一行一行写到文件中

神迹网页不是utf-8的编码,所以大家要消除编码的难点

#编码问题
import requests
response=requests.get('http://www.autohome.com/news')
# response.encoding='gbk' #汽车之家网站返回的页面内容为gb2312编码的,而requests的默认编码为ISO-8859-1,如果不设置成gbk则中文乱码
print(response.text)

 

得到二进制数据和二进制流

  图片和录制大家拿到下来时是二进制数据,那时候大家要用wb的样式写到本地。但一时候摄像相当的大,大家一下子加载到内部存款和储蓄器再去写入本地是不创设的,所以大家会用到二进制流

写二进制数据:

图片 2图片 3

import requests

response=requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509868306530&di=712e4ef3ab258b36e9f4b48e85a81c9d&imgtype=0&src=http://www.guoyu588.com/uploads/allimg/191223/0J05612F-3.jpg')

with open('a.jpg','wb') as f:
    f.write(response.content)

View Code

二进制流:

图片 4图片 5

#stream参数:一点一点的取,比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的

import requests

response=requests.get('https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo-transcode/1767502_56ec685f9c7ec542eeaf6eac93a65dc7_6fe25cd1347c_3.mp4',
                      stream=True)

with open('b.mp4','wb') as f:
    for line in response.iter_content():
        f.write(line)

View Code

 

解析json数据:

#解析json
import requests
response=requests.get('http://httpbin.org/get')

import json
res1=json.loads(response.text) #太麻烦

res2=response.json() #直接获取json数据

print(res1 == res2) #True

 

Redirection and History

图片 6图片 7

By default Requests will perform location redirection for all verbs except HEAD.

We can use the history property of the Response object to track redirection.

The Response.history list contains the Response objects that were created in order to complete the request. The list is sorted from the oldest to the most recent response.

For example, GitHub redirects all HTTP requests to HTTPS:

>>> r = requests.get('http://github.com')

>>> r.url
'https://github.com/'

>>> r.status_code

>>> r.history
[<Response [301]>]
If you're using GET, OPTIONS, POST, PUT, PATCH or DELETE, you can disable redirection handling with the allow_redirects parameter:

>>> r = requests.get('http://github.com', allow_redirects=False)

>>> r.status_code

>>> r.history
[]
If you're using HEAD, you can enable redirection as well:

>>> r = requests.head('http://github.com', allow_redirects=True)

>>> r.url
'https://github.com/'

>>> r.history
[<Response [301]>]

先看官网的解释

官方网址解释(强行装作看得懂的模范)

图片 8图片 9

import requests
import re

#第一次请求
r1=requests.get('https://github.com/login')
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN

#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
data={
    'commit':'Sign in',
    'utf8':'✓',
    'authenticity_token':authenticity_token,
    'login':'317828332@qq.com',
    'password':'alex3714'
}






#测试一:没有指定allow_redirects=False,则响应头中出现Location就跳转到新页面,r2代表新页面的response
r2=requests.post('https://github.com/session',
             data=data,
             cookies=r1_cookie
             )

print(r2.status_code) #200
print(r2.url) #看到的是跳转后的页面
print(r2.history) #看到的是跳转前的response
print(r2.history[0].text) #看到的是跳转前的response.text


#测试二:指定allow_redirects=False,则响应头中即便出现Location也不会跳转到新页面,r2代表的仍然是老页面的response
r2=requests.post('https://github.com/session',
             data=data,
             cookies=r1_cookie,
             allow_redirects=False
             )


print(r2.status_code) #302
print(r2.url) #看到的是跳转前的页面https://github.com/session
print(r2.history) #[]

选取github登陆后跳转到主页面包车型大巴例证来注脚它

 

 

 1.1.urlopen函数的用法

#encoding:utf-8

from urllib import request

res = request.urlopen("https://www.cnblogs.com/")

print(res.readlines())


#urlopen的参数
#def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
#            *, cafile=None, capath=None, cadefault=False, context=None):

  央求库,即能够一成不改变浏览器对网址发起呼吁的模块(库)。

 1.2.urlretrieve函数

 将网页上的文件保留到地点

#coding:utf-8

from urllib import request

res = request.urlretrieve("https://www.cnblogs.com/",'cnblog.html')


#urlretrieve参数
#def urlretrieve(url, filename=None, reporthook=None, data=None):

听他们讲POST的伸手格局

  诉求的代码与GET相似,可是因为POST恳求的参数放在央浼体里,所以在传参的时候会多二个data参数,用于放置乞请的参数音讯。

图片 10图片 11

'''
一 目标站点分析
    浏览器输入https://github.com/login
    然后输入错误的账号密码,抓包
    发现登录行为是post提交到:https://github.com/session
    而且请求头包含cookie
    而且请求体包含:
        commit:Sign in
        utf8:✓
        authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==
        login:egonlin
        password:123


二 流程分析
    先GET:https://github.com/login拿到初始cookie与authenticity_token
    返回POST:https://github.com/session, 带上初始cookie,带上请求体(authenticity_token,用户名,密码等)
    最后拿到登录cookie

    ps:如果密码时密文形式,则可以先输错账号,输对密码,然后到浏览器中拿到加密后的密码,github的密码是明文
'''

import requests
import re

#第一次请求
r1=requests.get('https://github.com/login')
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN

#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
data={
    'commit':'Sign in',
    'utf8':'✓',
    'authenticity_token':authenticity_token,
    'login':'317828332@qq.com',
    'password':'alex3714'
}
r2=requests.post('https://github.com/session',
             data=data,
             cookies=r1_cookie
             )


login_cookie=r2.cookies.get_dict()


#第三次请求:以后的登录,拿着login_cookie就可以,比如访问一些个人配置
r3=requests.get('https://github.com/settings/emails',
                cookies=login_cookie)

print('317828332@qq.com' in r3.text) #True

自动登录github(自己处理cookie信息)

手动管理cookie后兑现全自动登陆github

图片 12图片 13

import requests
import re

session=requests.session()
#第一次请求
r1=session.get('https://github.com/login')
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN

#第二次请求
data={
    'commit':'Sign in',
    'utf8':'✓',
    'authenticity_token':authenticity_token,
    'login':'317828332@qq.com',
    'password':'alex3714'
}
r2=session.post('https://github.com/session',
             data=data,
             )

#第三次请求
r3=session.get('https://github.com/settings/emails')

print('317828332@qq.com' in r3.text) #True

行使requests.session(卡塔尔国自动帮大家管理cookie音信后活动登陆GitHub

补充表达

图片 14图片 15

requests.post(url='xxxxxxxx',
              data={'xxx':'yyy'}) #没有指定请求头,#默认的请求头:application/x-www-form-urlencoed

#如果我们自定义请求头是application/json,并且用data传值, 则服务端取不到值
requests.post(url='',
              data={'':1,},
              headers={
                  'content-type':'application/json'
              })


requests.post(url='',
              json={'':1,},
              ) #默认的请求头:application/json

View Code

 

 1.4.urlparse和urlsplit函数用法

 urlparse和``urlsplit都是用来对url的各个组成部分进行分割的,唯一不同的是urlsplit没有"params"这个属性.

from urllib import request,parse

url = "https://www.baidu.com/s?wd=cnblog#2"
result = parse.urlparse(url)
print(result)
#ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=cnblog', fragment='2')

print('scheme:',result.scheme)   #协议
print('netloc:',result.netloc)   #域名
print('path:',result.path)       #路径
print('query:',result.query)     #查询参数

#结果
#scheme: https
# netloc: www.baidu.com
# path: /s
# query: wd=cnblog

requests模块

  使用requests能够如法泡制浏览器的乞请,requests模块的实为是包裹了urllib3模块的成效,比起此前运用的urllib,requests模块的api特别便民

  requests库发送央浼将网页内容下载下来今后,并不会实行js代码,那亟需大家自身解析目的站点然后发起新的request央浼,不过selenium模块就足以试行js的操作。

安装:

pip3 install requests

  

倡议格局:主要接纳的就get和post三种

#各种请求方式:常用的就是requests.get()和requests.post()
import requests

r = requests.get('https://api.github.com/events')
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')

#GET请求
HTTP默认的请求方法就是GET
     * 没有请求体
     * 数据必须在1K之内!
     * GET请求数据会暴露在浏览器的地址栏中

GET请求常用的操作:
       1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
       2. 点击页面上的超链接也一定是GET请求
       3. 提交表单时,表单默认使用GET请求,但可以设置为POST


#POST请求
(1). 数据不会出现在地址栏中
(2). 数据的大小没有上限
(3). 有请求体
(4). 请求体中如果存在中文,会使用URL编码!


#!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据

 

本文由金沙澳门官网发布于网络编程,转载请注明出处:爬虫供给库,21天创制布满式爬虫

关键词: 金沙澳门官网