猴子都能学会的20行代码登录微博

猴子都能学会的20行代码登录微博

如何登录新浪微博是令许多数据新手(包括我)头疼的大问题。由于新浪的反爬虫策略,网上的教程往往撑不过几个月,查阅到的资料在半年前或是一年前——而它们早就无法使用了,在你想开始爬虫的时候被活生生卡在了第一步。

简单而言,我使用的方法是通过 Selenium 模拟浏览器的行为,直接在浏览器中输入用户名和密码并登录,然后直接从浏览器中获取 Cookies。虽然听起来十分简单(实际上也十分简单),但是确实是十分有效的方式。只要一个网站能通过浏览器登陆,我们就可以简单改造这个程序来登录并获得想要的资料。

什么是Selenium?如何使用?

Selenium 是一个项目的名称,都与浏览器和网页测试相关。主要的工具也就是今天我们所要使用的,是WebDriver,是一个浏览器自动化工具。它为很多不同的语言提供了库,包括 Python、Java、Ruby 等。本文中我选择使用 Python 来进行操作,当然你也可以使用你熟悉的语言来进行操作。

在 Python中使用 Selenium 只需要通过pip安装 Selenium 提供的 Python 库。

pip3 install selenium  # 如果你使用 Python 2 ,请使用 pip install selenium

仅仅安装 Selenium 本身是不够的,你同时还需要安装 Driver 。你可以将 Driver 理解为浏览器本身的『驱动』,在程序中使用 Driver 就相当于你打开了一个浏览器做了些什么事情。

在这里我们推荐几个 Driver :

  1. Firefox: https://github.com/mozilla/geckodriver/releases
  2. Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
  3. PhantomJS: http://phantomjs.org/download.html

(如果你是Windows用户,这部分内容也需要参考:http://selenium-python.readthedocs.io/installation.html#detailed-instructions-for-windows-users

下载后,我建议将可执行文件加入环境中,以备使用。

Firefox 和 Chrome 相信大家都比较熟悉。PhantomJS 是一个可以让你无需浏览器就进行网页相关操作的WebKit,它也没有图形界面。个人比较推荐在调试程序期间使用 Firefox 或是 Chrome ,这样你可以通过观察发现自己哪里出了错。在调试完成后使用 PhantomJS ,来避免多余的可视化渲染。

创建一个 WebDriver

利用 Selenium 创建 WebDriver 十分简单粗暴:

from selenium import webdriver
driver = webdriver.Firefox()  # 如果 Firefox 所时使用的 geckodriver 在环境中
# driver = webdriver.PhantomJS()  # 如果你想使用 PhantomJS

如果你需要自定义路径,你可以通过传入参数 executable_path

driver = webdriver.Firefox(executable_path="/path/to/geckodriver")

如果你使用 Firefox 或 Chrome,你会看到这个操作打开一个浏览器。

观察网页本身

为了方便演示,我们使用新浪的移动版进行登录。如果想决定如何操作一个网页,首先我们要观察网页本身。

右键登录的地方并审查元素,你会发现用户名和密码其实是简单的输入框,而登录按钮是一个链接而已。

因此我们简单规划之后要做的事情:

  1. 输入用户名和密码
  2. 点击登录按钮(或摁回车)

利用 Selenium 进行登录操作

打开网页

Selenium 提供了方法的get方法用以获取网页:

driver.get('https://passport.weibo.cn/signin/login')

如果你使用 Firefox 或 Chrome,你会看到这个操作打开微博手机版的登录页面。

定位元素

由网页本身的结构我们发现,这两个输入框和登录链接元素的id属性都是页面中独一无二的,我们便可以利用这一特点寻找到元素本身。

name_field = driver.find_element_by_id('loginName')  # 用户名输入框
password_field = driver.find_element_by_id('loginPassword')  # 密码输入框
submit_button = driver.find_element_by_id('loginAction')  # 登录键

输入内容

Selenium 提供了为元素输入的方法 send_keys(),直接调用这一方法就可以把内容输入到网页中的输入框内:

name_field.send_keys('你的用户名')
password_field.send_keys('你的密码')

如果你使用 Firefox 或 Chrome ,你会看到页面中的两个输入框被填入你在程序中输入的文字。

点击按钮的方法也很简单,如果你已经获取了元素,只要使用click()方法:

submit_button.click()  # 单击元素

如果你需要使用回车键,可以使用send_keys()来发送回车(Keys.RETURN),我在这里不展开描述。

如果你担心两个输入框在你输入前就已经有了其他内容而影响操作,你可以使用clear()方法,并且我在这里也更加推荐这样的做法:

name_field.clear()  # 清除用户名区域
name_field.send_keys('你的用户名')

password_field.clear()  # 清除密码区域
password_field.send_keys('你的密码')

获取 Cookies

从 WebDriver 获取 Cookies 只需要一个操作 get_cookies()

driver.get_cookies()

它是一个字典文件的列表,每一个字典文件是一个 Cookie。如果你们要在其他 WebDriver 或浏览器中使用这组 Cookies ,使用一个循环来给 WebDriver 利用add_cookie方法添加是比较标准的方法:

for cookie in driver.get_cookies():
    another_driver.add_cookie(cookie)

等待网页载入

如果你仅仅执行上述代码,你会发现如果你的网速不够快,或是电脑不够好,就非常容易在元素出现前就进行操作,然后出现无法找到元素或是元素不可见等错误,我们可以通过等待一段时间来解决这个问题:

import time

# 在获取网页后
time.sleep(2) # 等待2秒

这种做法比较简单,但也十分粗暴:因为你无法确定2秒时间足够让网页加载完成。每次打开网页的时间受限于许多因素,你可能很难用一个固定的时间来决定。而 Selenium 本身也提供了一些好用的方法:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 在获取网页后
WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, 'loginName'))) 
# 等待 id 为 loginName的元素出现,最多20秒

结语

如何登录网站对于收集数据的人而言是个不大不小的问题。通过使用 Selenium,我们几乎可以通过各种方法模拟浏览器的操作,而且这种方法是只要浏览器存在就可以使用的。我相信如何观察网页的结构以及利用是非常有用的技能。

完整代码

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.PhantomJS()
driver.get('https://passport.weibo.cn/signin/login')
WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, 'loginName')))
time.sleep(1)

name_field = driver.find_element_by_id('loginName')
name_field.clear()
name_field.send_keys('你的账号')
password_field = driver.find_element_by_id('loginPassword')
password_field.clear()
password_field.send_keys('你的密码')
submit_button = driver.find_element_by_id('loginAction')
submit_button.click()

print(driver.get_cookies())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容