http://www.hangge.com/blog/cache/detail_1697.html
下面,我们就通过 Fiddler 截取登录请求。
当点击登录时,官场 Fiddler 页面,左侧可以看到抓取了大量请求。通过观察,第15个请求的 URL中含有「login」字段,很有可能是登录的 POST 请求。我们点击该请求,回到右侧,分别点击「inspectors」、「Headers」,可以看到就是 POST 请求,该 URL 和上面的方法获取的 URL 是一致的。
接着,切换到右侧的 Webforms 选项,可以看到 Body 请求体。也和上面方法中得到的一致。
获取到 URL 和请求体参数之后,下面就可以开始用 Requests.post 方法模拟登录了。
代码如下:
1import requests
2headers = {
3 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
4 }
5data = {
6 'identity':'irw27812@awsoo.com',
7 'password':'test2018',
8}
9url ='https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
10session = requests.Session()
11session.post(url,headers = headers,data = data)
12# 登录后,我们需要获取另一个网页中的内容
13response = session.get('http://radar.itjuzi.com/investevent',headers = headers)
14print(response.status_code)
15print(response.text)
使用 session.post 方法提交登录请求,然后用 session.get 方法请求目标网页,并输出 HTML代码。可以看到,成功获取到了网页内容。
下面,介绍第 2 种方法。
3. 获取 Cookies,直接请求登录
上面一种方法,我们需要去后台获取 POST 请求链接和参数,比较麻烦。下面,我们可以尝试先登录,获取 Cookie,然后将该 Cookie 添加到 Headers 中去,然后用 GET 方法请求即可,过程简单很多。
代码如下:
1import requests
2headers = {
3 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
4 'Cookie': '你的cookie',
5}
6url = 'https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
7session = requests.Session()
8response = session.get('http://radar.itjuzi.com/investevent', headers=headers)
9
10print(response.status_code)
11print(response.text)
可以看到,添加了 Cookie 后就不用再 POST 请求了,直接 GET 请求目标网页即可。可以看到,也能成功获取到网页内容。
下面介绍第 3 种方法。
4. Selenium 模拟登录
这个方法很直接,利用 Selenium 代替手动方法去自动输入账号密码然后登录就行了。
代码如下:
1from selenium import webdriver
2from selenium.webdriver.common.by import By
3from selenium.webdriver.support import expected_conditions as EC
4from selenium.webdriver.support.wait import WebDriverWait
5browser = webdriver.Chrome()
6browser.maximize_window() # 最大化窗口
7wait = WebDriverWait(browser, 10) # 等待加载10s
8
9def login():
10 browser.get('https://www.itjuzi.com/user/login')
11 input = wait.until(EC.presence_of_element_located(
12 (By.XPATH, '//*[@id="create_account_email"]')))
13 input.send_keys('irw27812@awsoo.com')
14 input = wait.until(EC.presence_of_element_located(
15 (By.XPATH, '//*[@id="create_account_password"]')))
16 input.send_keys('test2018')
17 submit = wait.until(EC.element_to_be_clickable(
18 (By.XPATH, '//*[@id="login_btn"]')))
19 submit.click() # 点击登录按钮
20 get_page_index()
21
22def get_page_index():
23 browser.get('http://radar.itjuzi.com/investevent')
24 try:
25 print(browser.page_source) # 输出网页源码
26 except Exception as e:
27 print(str(e))
28login()
这里,我们在网页中首先定位了账号节点位置:'//*[@id="create_account_email"]'
,然后用 input.send_keys 方法输入账号,同理,定位密码框位置并输入密码。接着定位 登录 按钮的位置://*[@id="login_btn"]
,然后用 submit.click() 方法实现点击登录按钮操作,从而完成登录。可以看到,也能成功获取到网页内容。
以上就是模拟需登录网站的几种方法。当登录进去后,就可以开始爬取所需内容了。
源代码可以在下面链接中获得:
https://github.com/makcyun/web_scraping_with_python
5. 总结:
- 本文分别实现了模拟登录的 3 种操作方法,建议优先选择第 2 种,即先获取 Cookies 再 Get 请求直接登录的方法。
- 本文模拟登录的网站,仅需输入账号密码,不需要获取相关加密参数,比如 Authenticity_token ,同时也无需输入验证码,所以方法比较简单。但是还有很多网站模拟登录时,需要处理加密参数、验证码输入等问题。后续将会介绍。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!