scrapy 模拟登陆
?
python 模擬登錄豆瓣 并 發表動態:https://blog.csdn.net/freeking101/article/details/65445551
python網絡爬蟲之使用scrapy自動登錄網站:https://www.cnblogs.com/zhanghongfeng/p/7684415.html
Scrapy筆記(11)- 模擬登錄:https://blog.csdn.net/sdulsj/article/details/52984874
python爬蟲之scrapy模擬登錄:https://www.cnblogs.com/lei0213/p/8203521.html
Requests and Responses 官方參考文檔:https://doc.scrapy.org/en/1.3/topics/request-response.html
?
?
?
使用?url +?用戶名?和?密碼形式登錄(使用?scrapy?框架)
?
一幀網不登錄的時候,“排行榜單”可以查看 30條數據,登錄之后可以查看 100條數據。
首先打開 fiddler(fiddler介紹及使用教程:https://blog.csdn.net/freeking101/article/category/6531758),如圖:
然后打開一幀的登錄頁面,輸入賬號、密碼,點擊創作者登錄,如圖:
登錄之后在打開 fiddler ,發現 fiddler 已經抓取了從登錄到登錄成功后的所有http 包,如圖:
登錄的 URL 找到了,還有發送的 post 數據找到了,下面就是寫代碼模擬 post 請求登錄了。
只要登錄后,就可以訪問登錄后任意一個頁面。
現在我需要的數據是“熱度榜單”,通過fiddle 抓包 和對比 網頁上顯示數據,需要的數據如圖所示:
把 fiddle 抓取到的 json 數據復制下來,然后隨便找一個 “json 在線解析工具”粘貼上去,就可以看到結果。
展開上面的 list 節點,可以看到 有 100條數據,因展開太長,截圖沒有展開。
模擬登陸 一幀網 示例代碼:
#!/usr/bin/python3 # -*- coding: utf-8 -*-import scrapy import time import jsonclass SlaveSpider(scrapy.Spider):name = "master_yizhen"start_urls = ['http://www.1zhen.com/api/user/login']main_url = 'http://www.1zhen.com/account'login_url = start_urls[0]login_headers = {'Host': 'www.1zhen.com',"Connection": "keep-alive",'Accept': 'application/json, text/plain, */*','X-Requested-With': 'XMLHttpRequest','Origin': 'http://www.1zhen.com','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) ''AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36','Content-Type': 'application/json;charset=UTF-8','Referer': 'http://www.1zhen.com/account','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9'}form_data = {"mobile": "12345678901", # 抓取 的 登陸的賬號(手機號)"password": "加密密碼", # 抓取 的 加密的密碼"role": "author"}def __init__(self):super(SlaveSpider, self).__init__()self.__base_url = 'http://www.1zhen.com'def start_requests(self):'''# 如果登錄 url 在瀏覽器中能打開,也可以使用這個方法進行登錄yield scrapy.Request(url=self.login_url,headers=self.login_headers,meta={'cookiejar': 1},callback=self.login, # 登錄函數)'''# 如果登錄 url 在瀏覽器中打開返回 404 ,則只有使用下面。# 一幀網(http://www.1zhen.com/)登錄頁面(http://www.1zhen.com/api/user/login)就屬于返回 404這種類型yield scrapy.Request(url=self.login_url,headers=self.login_headers,meta={'cookiejar': 1},callback=self.after_login,method='post', # 設置請求方法為 post 請求body=json.dumps(self.form_data) # 設置請求體,即請求參數) # 通過上面 fiddle 抓取的 請求登錄 的 URL ,可以看到 請求登錄的URL使用的是 post 方法def login(self, response): # 這個函數使用與 當 登錄頁面可以訪問時的情況print(response.url)print(response.text)form_data = {"mobile": "12345678901", # 抓取 的 登錄賬號"password": "加密的密碼", # 抓取 的 加密密碼"role": "author"}yield scrapy.FormRequest.from_response(response,formdata=form_data,headers=self.login_headers,meta={'cookiejar': response.meta['cookiejar']},callback=self.after_login,)def after_login(self, response):print(response.url)t = time.localtime(time.time())week_time = '{0}-{1}-{2}'.format(t.tm_year, t.tm_mon, t.tm_mday)page_url = '{0}/api/rank/author?during=week&pt_week={1}&platform=all&category=1'.format(self.__base_url,week_time) # 構造請求的 URLyield scrapy.Request(url=page_url,headers=self.login_headers,meta={'cookiejar': response.meta['cookiejar']},callback=self.parse_data) # 通過上面 fiddle 抓包,可以看到請求的 URL 使用的 get 方法passdef parse_data(self, response):data = json.dumps(response.text, ensure_ascii=False, indent=4)print(data)pass運行結果截圖:
?
網上找的一個使用 scrapy 模擬登錄的示例代碼:
#!/usr/bin/python3 # -*- coding: utf-8 -*-import scrapy from scrapy import FormRequest, Requestclass ExampleLoginSpider(scrapy.Spider):name = "login_"allowed_domains = ["example.webscraping.com"]start_urls = ['http://example.webscraping.com/user/profile']login_url = 'http://example.webscraping.com/places/default/user/login'def parse(self, response):print(response.text)def start_requests(self):yield scrapy.Request(self.login_url, callback=self.login)def login(self, response):form_data = {'email': 'liushuo@webscraping.com','password': '12345678'}yield FormRequest.from_response(response, formdata=form_data, callback=self.parse_login)def parse_login(self, response):# print('>>>>>>>>'+response.text)if 'Welcome Liu' in response.text:yield from super().start_requests()?
?
?
使用?url +?用戶名?和?密碼形式登錄(使用?requests?包登錄)
?
上面是使用 scrapy 進行模擬登錄
現在不使用scrapy 這個框架,使用 python 的 requests 這個牛逼的模塊進行模擬登錄,并把數據存到本地 redis? 里面
代碼如下:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Author : # @File : general.py # @Software : PyCharm # @description : import requests import json import redis import hashlib import timeclass OneZhen(object):def __init__(self):self.__custom_headers = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6","Cache-Control": "max-age=0","Connection": "keep-alive","Content-Type": "application/x-www-form-urlencoded","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36","Referer": "http://www.1zhen.com/account","Host": "www.1zhen.com",}self.__post_data = {"mobile": "12345678901", # 登錄的賬號"password": "加密的密碼", # 加密的密碼"role": "author",}self.__login_url = 'http://www.1zhen.com/api/user/login'self.__base_url = 'http://www.1zhen.com'self.data = Noneself.__session = requests.session() # 定義 session 會話(session可以自動管理cookies, scrapy貌似需要通過meta傳遞cookies)self.__session.headers = self.__custom_headers # 設置請求頭def login_onezhen(self, week_time):r = self.__session.post(self.__login_url, self.__post_data)if r.status_code == 200:# print(r.content)page_url = '{0}/api/rank/author?during=week&pt_week={1}&platform=all&category=1'.format(self.__base_url, week_time)page_content = self.__session.get(url=page_url)json_data = page_content.content.decode('utf-8')self.data = json.loads(json_data)else:print('login fail and status_code is {0}'.format(r.status_code))return self.datadef get_data(self, week_time):return self.login_onezhen(week_time)redis_host = '127.0.0.1' redis_port = 6379 r_db = redis.Redis(host=redis_host, port=redis_port, db=0)def write_redis(key, data_dict):r_db.hmset(key, data_dict)passdef main():# current_time = '2018-06-19't = time.localtime(time.time())current_time = '{0}-{1}-{2}'.format(t.tm_year, t.tm_mon, t.tm_mday)onezhen = OneZhen()data = onezhen.get_data(current_time)print('from yizhen get data success and write redis...')for d in data['data']['list']:# key = md5(d['author']['name'])user_name = d['author']['name']user_info = dict(name=user_name,head_img_url_yizhen=d['author']['avatar'],category=d['author']['category'])write_redis(d['author']['name'], user_info)print('write redis success and exit')def md5(src):m = hashlib.md5()m.update(src.encode('UTF-8'))return m.hexdigest()if __name__ == "__main__":main()pass通過 Redis Desktop Manager 連接到本地 Redis ,可以看到本地 Redis 里面的數據。
?
?
?
使用 Cookies 模擬登錄
?
From:https://www.jianshu.com/p/887af1ab4200
總結一下使用Cookie登錄的好處:不需要知道登錄url和表單字段以及其他參數,不需要了解登錄的過程和細節。由于不是采用登錄url, 用戶名+密碼的方式。配合工具使用,快速方便。
所謂用Cookie實現登錄,就把過登錄過的信息(包括用戶名、密碼以及其他的驗證信息)打包一起發給服務器,告訴服務器我是登錄驗證過的。
不足之處,Cookie有過期時間,過一段時間再運行這個爬蟲,需要重新獲取一下Cookie的值。抓取數據過程是沒有問題的。
?
關于Cookie的介紹:
Cookie分類
Cookie總是保存在用戶客戶端中,按在客戶端中的存儲位置,可分為內存Cookie和硬盤Cookie。Cookie的有效性,最短的瀏覽器關閉后就消失了,最長是可以一直保存,直到被刪除。
Cookie用途
因為HTTP協議是無狀態的,即服務器不知道用戶上一次做了什么,這嚴重阻礙了交互式Web應用程序的實現。
在典型的應用是網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅干和兩飲料。最后結帳時,由于HTTP的無狀態性,不通過額外的手段,服務器并不知道用戶到底買了什么。
所以Cookie就是用來繞開HTTP的無狀態性的“額外手段”之一。服務器可以設置或讀取Cookies中包含信息,借此維護用戶跟服務器中的狀態。
Cookie的缺陷
1)Cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
?
?
?
?
總結
以上是生活随笔為你收集整理的scrapy 模拟登陆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不用加减乘除算加法
- 下一篇: 快速转 TypeScript 指南