Python爬蟲之requests庫的使用


requests庫

雖然Python的標准庫中 urllib模塊已經包含了平常我們使用的大多數功能,但是它的 API 使用起來讓人感覺不太好,而 Requests宣傳是 “HTTP for Humans”,說明使用更簡潔方便。

安裝和文檔地址:

利用pip可以非常方便的安裝:

pip install requests

中文文檔:http://docs.python-requests.org/zh_CN/latest/index.html
github地址:https://github.com/requests/requests

發送GET請求:

  1. 最簡單的發送get請求就是通過requests.get來調用:

    response = requests.get("http://www.baidu.com/") 
  2. 添加headers和查詢參數:
    如果想添加 headers,可以傳入headers參數來增加請求頭中的headers信息。如果要將參數放在url中傳遞,可以利用 params 參數。相關示例代碼如下:

     import requests kw = {'wd':'中國'} headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} # params 接收一個字典或者字符串的查詢參數,字典類型自動轉換為url編碼,不需要urlencode() response = requests.get("http://www.baidu.com/s", params = kw, headers = headers) # 查看響應內容,response.text 返回的是Unicode格式的數據 print(response.text) # 查看響應內容,response.content返回的字節流數據 print(response.content) # 查看完整url地址 print(response.url) # 查看響應頭部字符編碼 print(response.encoding) # 查看響應碼 print(response.status_code) 

發送POST請求:

  1. 最基本的POST請求可以使用post方法:

    response = requests.post("http://www.baidu.com/",data=data) 
  2. 傳入data數據:
    這時候就不要再使用urlencode進行編碼了,直接傳入一個字典進去就可以了。比如請求拉勾網的數據的代碼:

     import requests url = "https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false&isSchoolJob=0" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36', 'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' } data = { 'first': 'true', 'pn': 1, 'kd': 'python' } resp = requests.post(url,headers=headers,data=data) # 如果是json數據,直接可以調用json方法 print(resp.json()) 

使用代理:

使用requests添加代理也非常簡單,只要在請求的方法中(比如get或者post)傳遞proxies參數就可以了。示例代碼如下:

import requests url = "http://httpbin.org/get" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36', } proxy = { 'http': '171.14.209.180:27829' } resp = requests.get(url,headers=headers,proxies=proxy) with open('xx.html','w',encoding='utf-8') as fp: fp.write(resp.text) 

cookie:

如果在一個響應中包含了cookie,那么可以利用cookies屬性拿到這個返回的cookie值:

import requests url = "http://www.renren.com/PLogin.do" data = {"email":"970138074@qq.com",'password':"pythonspider"} resp = requests.get('http://www.baidu.com/') print(resp.cookies) print(resp.cookies.get_dict()) 

session:

之前使用urllib庫,是可以使用opener發送多個請求,多個請求之間是可以共享cookie的。那么如果使用requests,也要達到共享cookie的目的,那么可以使用requests庫給我們提供的session對象。注意,這里的session不是web開發中的那個session,這個地方只是一個會話的對象而已。還是以登錄人人網為例,使用requests來實現。示例代碼如下:

import requests url = "http://www.renren.com/PLogin.do" data = {"email":"970138074@qq.com",'password':"pythonspider"} headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" } # 登錄 session = requests.session() session.post(url,data=data,headers=headers) # 訪問大鵬個人中心 resp = session.get('http://www.renren.com/880151247/profile') print(resp.text) 

處理不信任的SSL證書:

對於那些已經被信任的SSL整數的網站,比如https://www.baidu.com/,那么使用requests直接就可以正常的返回響應。示例代碼如下:

resp = requests.get('http://www.12306.cn/mormhweb/',verify=False) print(resp.content.decode('utf-8'))

編寫Scrapy-Redis分布式爬蟲:

要將一個Scrapy項目變成一個Scrapy-redis項目只需修改以下三點就可以了:

  1. 將爬蟲的類從scrapy.Spider變成scrapy_redis.spiders.RedisSpider;或者是從scrapy.CrawlSpider變成scrapy_redis.spiders.RedisCrawlSpider
  2. 將爬蟲中的start_urls刪掉。增加一個redis_key="xxx"。這個redis_key是為了以后在redis中控制爬蟲啟動的。爬蟲的第一個url,就是在redis中通過這個發送出去的。
  3. 在配置文件中增加如下配置:
    # Scrapy-Redis相關配置 # 確保request存儲到redis中 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 確保所有爬蟲共享相同的去重指紋 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 設置redis為item pipeline ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300 } # 在redis中保持scrapy-redis用到的隊列,不會清理redis中的隊列,從而可以實現暫停和恢復的功能。 SCHEDULER_PERSIST = True # 設置連接redis信息 REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379 
  1. 運行爬蟲:
    1. 在爬蟲服務器上。進入爬蟲文件所在的路徑,然后輸入命令:scrapy runspider [爬蟲名字]
    2. Redis服務器上,推入一個開始的url鏈接:redis-cli> lpush [redis_key] start_url開始爬取。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM