Python爬虫模拟登陆的黑魔法
优采云 发布时间: 2020-05-10 08:02今天用 requests + BeautifulSoup 抓取 aliexpress 的时侯, 在模拟登陆时侯出现了好多问题, 提交数据时会对密码等一些数组加密, 而且递交一大堆不知名的数组, 大概有二十多项。 看到那么多数组, 整个人就不好了, 作为一个懒人, 准备绕开这个坑。
大概思路是这样, 通过 selenium 打开浏览器, 模拟登陆。 获取cookies ,并将cookies以文件的方式保存到本地。 当我们使用requests打开页面的时侯就可以用本地的cookies。 由于 通过selenium打开浏览器的形式登录没有那么多限制,只须要模拟登陆流程( 输入账号密码python爬虫模拟登录, 点击登入即可登录)。 而且selenium可以模拟各类浏览器,亦可以在命令行下实现浏览器功能。
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysdef login(username, password browser=None):
browser.get("https://login.example.com/")
pwd_btn = browser.find_element_by_name("password")
act_btn = browser.find_element_by_name("loginId")
submit_btn = browser.find_element_by_name("submit-btn")
act_but.send_keys(username)
pwd_btn.send_keys(password)
submint_btn.send_keys(Keys.ENTER) return browser
通过seleum 模拟登录python爬虫模拟登录, 然后将cookie打包保存到本地
import requests
request = requests.Session()
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"}
request.headers.update(headers)
cookies = browser.get_cookies()
# save the current cookies as a python object using pickle import selenium.webdriver
import pickle
pickle.dump( cookies , open("cookies.ini","wb"))
# add them back:browser = selenium.webdriver.Firefox()
browser.get("http://www.example.com")
cookies = pickle.load(open("cookies.pkl", "rb"))for cookie in cookies:
browser.add_cookie(cookie)
import pickleimport selenium.webdriver
import pickleimport requests
cookies = pickle.load(open("cookies.pkl", "rb"))
request = requests.Session()
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"}
request.headers.update(headers)for cookie in cookies:
request.cookies.set(cookie['name'], cookie['value'])# 加载cookies后登录网站request.get("www.example.com")
import pickleimport requestsfrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysdef setup():
browser = webdriver.Firefox() return browserdef login(username, password browser=None):
browser.get("https://login.example.com/")
pwd_btn = browser.find_element_by_name("password")
act_btn = browser.find_element_by_name("loginId")
submit_btn = browser.find_element_by_name("submit-btn")
act_but.send_keys(username)
pwd_btn.send_keys(password)
submint_btn.send_keys(Keys.ENTER) return browserdef set_sessions(browser):
request = requests.Session()
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
}
request.headers.update(headers)
cookies = browser.get_cookies() for cookie in cookies:
request.cookies.set(cookie['name'], cookie['value']) return requestif __name__ == "__main__":
browser = login("textusername", "tespassword", setup())
rq = set_sessiond(browser)
re.get("http://www.example.com")
由于selenium 下的phantomJS在使用过程中出现了不知缘由的各类坑。 所以在Python中我们可以用下边的方式,在命令行打开Chrome、FireFox。
from pyvirtualdisplay import Displayfrom selenium import webdriver
display = Display(visible=0, size=(1024, 768))
display.start()
chromedriver = "/root/project/driver/chromedriver"os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(chromedriver)
作者:王独立
链接: