python3の爬虫類(2) - 基本的なライブラリの使用要求、高度なアプリケーション、例外処理

本論文でのトライアル環境:のpython3
ライブラリリクエスト、クッキー、ログイン認証urllibはPythonの爬虫類要求よりもより強力な、プロキシの設定やその他の操作は、良い解決策を持っています
インストール:
ピップリクエストをインストール 
はじめに:
インポート要求

ディレクトリ

まず、基本的な使い方

1.1、依頼文

1.2は、要求されたパラメータのparamsを取得します

1.3、ポスト要求データパラメータ

1.4、ウェブは通常、ヘッダー、タイムアウト、time.sleep情報を追加するクロール

1.5、JSON形式の解析

1.6、バイナリデータの解析をつかみます

1.7、応答

二つは、高度なアプリケーションライブラリを要求します

2.1、クッキー治療

2.2、ログイン状態を維持するために、維持するためにセッション。Sessionオブジェクト。

2.3、プロキシの設定

2.4認証

2.5、準備要求

2.6その他:SSL証明書の検証、ファイルのアップロード、OAuth認証

第三に、例外処理


まず、基本的な使い方

1.1、依頼文

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# pip install requests #安装
import requests  #导入
r=requests.get("https://me.csdn.net/column/weixin_41685388")
print(type(r)) #类型:<class 'requests.models.Response'>
print(r. status_code)#状态:200 或者404、500...等
print(type(r.text)) #响应体的类型:<class 'str'>
print(r.cookies) #cookies:<RequestsCookieJar[<Cookie(.*)/>]>
print(r.text) #页面内容
#使用get()方法成功实现一个GET请求,这倒不算什么,
# 更方便之处在于其他的请求类型依然可以用一句话来完成,示例如下:
r1=requests.post('http://httpbin.org/post')
r2=requests.put('http://httpbin.org/put')
r3=requests.delete('http://httpbin.org/delete')
r4=requests.head('http://httpbin.org/get')
r5=requests.options("http://httpbin.org/get")

1.2は、要求されたパラメータのparamsを取得します

import requests
r=requests.get('http://httpbin.org/get?name=germey&age=22')
#<==>等价于
data={'name':'germey','age':22}
r1=requests. get("http://httpbin.org/get", params=data)
print(r1.text)

1.3、ポスト要求データパラメータ

辞書の応答= requests.post(URL、データ=データ、ヘッダ=ヘッダ、タイムアウト= 30)#data
def youdao(input):
    import requests
    from requests.exceptions import ConnectTimeout
    import time
    import random
    url=r"http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
    Headers = { }
    Headers["Cookie"]=r'OUTFOX_SEARCH_USER_ID_NCOO=1564612197.2237918; OUTFOX_SEARCH_USER_ID="[email protected]"; _ga=GA1.2.269278628.1571982437; _ntes_nnid=db62add68d78e9de1c202b8b131b32a4,1579175684866; JSESSIONID=aaaGcKLB2j8UhdX6Q3V_w; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1579203741289'
    Headers["User-Agent"]=r"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
    data = { } #post请求需要的data参数,在网页检查的Form Data中,
    #data["i"]="I am jalen" #认真一点你会发现这就是我们输入的值,自己做一个简单的有道翻译只需要修改这里就可以实现
    data["i"] = input  #那就按照习惯在函数外单独输入经常变化的值
    data["from"]="AUTO"
    data["to"]="AUTO"
    data["smartresult"]="dict"
    data["client"]="fanyideskweb"
    data["salt"]="15792037412906"
    data["sign"]="324404ee89ccb63c2ea1efb7d311db26"
    data["ts"]="1579203741290"
    data["bv"]="74b3450c611e373bdb05dc0a4ecdedd0"
    data["doctype"]="json"
    data["version"]="2.1"
    data["keyfrom"]="fanyi.web"
    data["action"]="FY_BY_CLICKBUTTION"
    rand = random.randint(2, 5)
    time.sleep(rand) #延时提交
    #请求时data直接用字典格式
    try:
        response=requests.post(url,data=data,headers= Headers,timeout=30)
        #print(response.text)
        html = response.json()
        #print(html)
        tgt = html['translateResult'][0][0][ 'tgt']
        print(tgt)
    except (ConnectTimeout) as e:
        print("ConnectTimeout")
        return
if __name__ == '__main__':
    input='I am jalen'
    youdao(input)

1.4、ウェブは通常、ヘッダー、タイムアウト、time.sleep情報を追加するクロール

  • ヘッダ:URLページ - >右クリック - >チェック(N) - >ネットワーク - > F5 - >(名前が目的のコンテンツが含まれていた) - >ヘッダ - >レスポンスヘッダ、一般的に使用される "クッキー"そして、「ユーザーエージェント」
  • タイムアウト:時間タイムアウト要求応答は、定義された設定時間を与えられます。requests.exceptions.ConnectTimeout
  • time.sleep:時間遅延提出を設定し、実際の共同プロセスの爬虫類で使用される乱数
import requests
import random
import time
import json
r=requests.get('http://httpbin.org/get?name=germey&age=22')
#<==>等价于
data={'name':'germey','age':22}
Headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'}
rand = random.randint(2, 5)
time.sleep(rand) #延时提交
r1=requests.get("http://httpbin.org/get", params=data,headers= Headers,timeout = 30)
print(type(r1.text))
#print(r1.text)
r1 = r1.json() #str-->json-->dict
print(type(r1)) #查看类型:dict
print(r1) #输出json格式的结果
'''
<class 'str'>
<class 'dict'>
{'args': {'age': '22', 'name': 'germey'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '27.47.130.215, 27.47.130.215', 'url': 'https://httpbin.org/get?name=germey&age=22'}

'''

1.5、JSON形式の解析

戻り値の型は、実際にWebページのSTRタイプですが、JSONフォーマットを解析する必要があります。JSONが呼び出すことができる()メソッドを直接JSON形式を変換することができ、結果が文字列辞書で返します。[ケースの例:1.3]。

1.6、バイナリデータの解析をつかみます

ケース:https://img-blog.csdnimg.cn/20191224145404163.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224

import requests
r=requests.get("https://img-blog.csdnimg.cn/20191224145404163.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224")
print(r.text) #结果:���� JFIF �� C
print(r.content) #结果:b'\xff\xd8\xff\xe0\x00\...代表是bytes类型的数据
with open('python.ico','wb') as f: #将图片以2进制的格式存在python.ico中,可以.png等其他格式
    f. write(r.content)

1.7、応答

リクエストを送信した後、応答が得られます。上記の例では、応答の内容を取得するテキストやコンテンツを使用します。加えて、多くの属性および方法が存在するようなステータスコード、応答ヘッダ、クッキーなどのように、追加情報を取得するために使用することができます。例としては、次のとおりです:

import requests
r=requests.get("https://blog.csdn.net/weixin_41685388/category_9426224.html")
print(type(r.status_code),r.status_code)  # 状态:200 或404、500等
print(type(r.headers),r.headers) # headers信息
print(type(r.cookies),r.cookies) # Cookie信息
print(type(r.history),r.history) # 请求历史记录
print(type(r.text),r.text) # 响应的内容 文本str格式
#print(type(r.json()),r.json()) # 响应的内容 json-->dict
#print(type(r.content),r.content) # 响应的内容 二进制文件

二つは、高度なアプリケーションライブラリを要求します

2.1、クッキー治療

(1)クッキーを得ます。

import requests 
r=requests. get("https://www.baidu.com/")
print(type(r.cookies),r.cookies) #获取cookies
for key, value in r.cookies.items(): 
    print(key+'='+value)

(2)クッキーの使用。

クッキーは、ヘッダーで使用されるログイン状態を維持するために使用されている、あなたは、ブラウザでWebページをクロールする実際のプロセスで見つけることができます。Googleのブラウザ、例えば:URLのページ - >右クリック - >チェック(N) - >ネットワーク - > F5 - >(名前が目的のコンテンツが含まれていた) - >ヘッダ - >レスポンスヘッダ、一般的な「クッキー」と「ユーザエージェント」。

2.2、ログイン状態を維持するために、維持するためにセッション。Sessionオブジェクト。

それによって、私たちは簡単に会話を維持することができますが、クッキーの問題について心配はしないでください、それは私たちが自動的に対処するのに役立ちます。あなたは成功したセッションパラメータを使用する前に、デフォルトのクッキーなどを使用するセッションオブジェクトは、サイトの他のページを請う再び使用し、その後、セッションを使用してWebサイトにログインしました。セッションオブジェクトは、私たちは、オブジェクトのプロパティを設定することで、セッションを達成するためのライブラリでもデフォルトのデータ要求方法を提供要請します。

大半は、特に我々がないことを、ご滞在中にいくつかの強制着陸は、いくつかのデータを返しません着陸すると、虚偽または不完全なデータであるクロール、クロールやアプリの時間に特定のサイトにログインして使用しますおそらくそれを行う方法にログインする必要があり、各要求を行うには、あなたがセッションを維持するための機能を使用する必要がある、我々は一度だけ訪れ、その後、そのように維持するか、他の多くの要求を行うことができます。

import requests
import time
# session()中方法和requests()中一样
# session.get()  session.post()
session = requests.session()
# 使用session发送post请求获取cookie保存到本地session中。
# 以人人网登录为例。
post_url = "http://www.renren.com/PLogin.do"
headers = {"User-Agent": "Mozilla/5.0"}
session = requests.session()
post_data = {"email": "username", "password": "password"}
session.post(post_url, headers=headers, data=post_data)
# 使用session请求登录后的页面
# 得到登录后的网页内容
url = "http://www.renren.com/xxxxx/profile"
response = session.get(url, headers=headers)

2.3、プロキシの設定

import requests
proxies = {
    'http': 'http://192.168.2.47:80',
    'https': 'https://157.245.54.87:8080'
} #临时代理ip会过期
r = requests.get("https://www.taobao.com",proxies=proxies)
print(r.text)

2.4認証

import requests 
from requests.auth import HTTPBasicAuth 
r=requests.get("http://localhost:5000",auth=HTTPBasicAuth("username","password"))
print(r. status_code)
#或
import requests 
r=requests.get("http://localhost:5000",auth=("username","password"))
print(r. status_code)

2.5、準備要求

ここでは、我々はその後、URL、データ及びヘッダが準備Requestオブジェクトに変換するためのセッションprepare_request()メソッドへの呼び出しを行う、その後、Requestオブジェクトのパラメータを構築するために、要求を導入して、送信を呼び出します()メソッドを送信することができます次のように:

2.6その他:SSL証明書の検証、ファイルのアップロード、OAuth認証

ない繰り返し

第三に、例外処理

デバッグプロセスにおける処理の実際の状況によると、一般的には、exceptions.xxxx例外処理の構文は次のとおりです。

from requests import exceptions
try:
    "无异常执行代码"
except exceptions.xxxx as e:
    "异常执行代码"
def timeout_request(url):
    import json
    import requests
    from requests import exceptions
    try:
        response = requests.get(url,timeout=0.000000005)
        response.raise_for_status()
    except exceptions.ConnectTimeout as e:
        print(e)
    except (exceptions.HTTPError,exceptions.MissingSchema) as e:
        print(e)
        
urls= ["https://blog.csdn.net/weixin_41685388/category_9426224.html","www.baidu.com/"]
for url in urls:
    timeout_request(url)

 

公開された104元の記事 ウォン称賛82 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_41685388/article/details/104032962