15天學會爬蟲 第二天

爬蟲

第二天

1.Response的常用屬性

  • response.headers 響應頭
  • response.request.headers 請求頭
  • response.status_code 狀態碼
  • response.request.url 請求的url
  • response.url 響應的url

2. 帶headers的請求

headers = {"User-Agent":"一般從瀏覽器複製"}
request.get{url = url, headers = headers}

3.帶參數的請求

params = {"wd":""}
request.get(url = url, headers = headers, params = params)

4.url編碼和解碼

# url解碼
url = requests.utils.unquote(url)
# url編碼
requests.utils.quote(url)

5.迭代器和可迭代

class Meta():
    def __init__(self):
        self.num = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.num < 10:
            self.num += 1
            return self.num
        raise StopIteration

"""
1.判斷Meta()對象是不是一個可迭代對象,查看是否具有__iter__()方法
2.獲取__iter__()的返回值,判斷是否是一個迭代器對象,查看時都同時具有__iter__()和__next__()方法
3.不停的調用__next__()的返回值,將其交給x,直到該方法拋出StopIteration異常
"""
for X in Meta():
    print(X)

6.百度翻譯

import requests
import json


class BaiduFanyi(object):
    def __init__(self, query_string):
        self.query_string = query_string
        self.headers = {
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
        }
        self.fanyi_url = "https://fanyi.baidu.com/basetrans"
        self.lan_url = "https://fanyi.baidu.com/langdetect"

        self.lan_from = "zh"
        self.lan_to = "en"

    def run(self):
        # 1.準備語言檢測接口需要的數據
        lan_data = self.get_lan_data()
        # 2. 發起語言檢測請求,返回響應
        lan_json_str = self.parse_post_url(self.lan_url, lan_data)
        # 3. 解析語言檢測結果
        self.get_lan_ret(lan_json_str)

        # 2. 準備數據
        data = self.get_data()
        # 3. 發起請求,獲得響應
        json_str = self.parse_post_url(self.fanyi_url, data)
        # 4. 解析json,提取數據
        ret = self.get_fanyi_ret(json_str)

        print(ret)

    def get_data(self):
        """
        組裝翻譯接口的數據
        :return:
        """
        return {
            "query": self.query_string,
            "from": self.lan_from,
            "to": self.lan_to
        }

    def parse_post_url(self, url, data):
        """
        發起post請求,返回響應
        :param url:
        :param data:
        :return:
        """
        resp = requests.post(url=url, data=data, headers=self.headers)
        return resp.content.decode()

    def get_fanyi_ret(self, json_str):
        """
        返回翻譯的結果
        :param json_str:
        :return:
        """
        ret_dict = json.loads(json_str)
        return ret_dict['trans'][0]['dst']

    def get_lan_data(self):
        """
        組裝語言檢測的數據
        :return:
        """
        return {
            "query": self.query_string
        }

    def get_lan_ret(self, lan_json_str):
        """
        解析語言檢測的結果,並修改翻譯需要的from和to的值
        :param lan_json_str:
        :return:
        """
        ret_dict = json.loads(lan_json_str)
        lan = ret_dict['lan']
        if lan == "en":
            self.lan_from = "en"
            self.lan_to = "zh"


if __name__ == '__main__':
    query_str = input(":")
    fanyi = BaiduFanyi(query_str)
    fanyi.run()

7.代理IP

單個IP頻繁請求一個網站的時候,很容易被識別爲一個爬蟲,爲了應對網站反爬蟲措施,可以使用代理

# 代理字典,key是代理的協議
proxies = {
    "https": "https://119.127.17.80:6395"
}
url = "https://www.youtube.com/"
resp = requests.get(url=url, proxies=proxies)

代理ip的分類

  • 透明代理:對方知道在使用代理,並且知道爬蟲的真實ip
  • 匿名代理:對方知道在使用代理,但不清楚爬蟲的真實的ip
  • 高匿代理:對方不知道在使用代理,更不清楚爬蟲的真實的ip

8. requests處理cookies之Session

創建一個session類的實例對象,和requests庫一樣,可以直接使用get和post方法

第一次使用session.post()的時候,網站會通過響應頭set-cookies讀取需要保存的cookies信息,並保存在session對象的cookies屬性中,下一次再發送請求的時候,會自動將保存的cookie寫入請求頭中,就可以訪問登陸後的頁面數據了。

import requests
session = requests.Session()
data = {
    "email": "xxx",
    "password": "xxxx"
}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0"
}
resp = session.post("http://www.renren.com/PLogin.do", data=data, headers=headers)

resp = session.get("http://www.renren.com/966796789/profile", headers=headers)
print(resp.content.decode())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章