Python+Selenium爬取新浪微博数据时的用户模拟登陆

您所在的位置:网站首页 如何账号登陆微博 Python+Selenium爬取新浪微博数据时的用户模拟登陆

Python+Selenium爬取新浪微博数据时的用户模拟登陆

2024-07-15 19:18| 来源: 网络整理| 查看: 265

新浪微博用户模拟登录 WebDriver基本元素定位方式xpath表达式定位 selenium–操作滚动条driver.switch_to.frame用法操作元素方法Python代码实现

模拟登陆的思路: 1.采用webdriver的get方法打开网页 2.选择用密码进行登陆(定位+点击) 3.在input tag输入用户名及密码(定位+输入) 4.登陆(定位+点击登陆按钮)

WebDriver基本元素定位方式

find_element_by_id() —采用id属性进行定位 例如在百度页面中输入关键字进行搜索

from selenium import webdriver import time driver = webdriver.Chrome() time.sleep(1) driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("Selenium")#关键字Selenium搜索 driver.find_element_by_id("su").click() time.sleep(2) driver.quit()

find_element_by_name() —采用name元素进行定位

driver.find_element_by_name("wd").send_keys("Python")#关键字Python搜索

find_element_by_class_name() —采用class名字属性进行定位

driver.find_element_by_class_name("bg s_btn").click()#点击“百度一下”按钮

find_element_by_xpath()—利用xpath进行定位

xpath表达式定位

‘/’表示一个层级,即是从根节点开始定位 ‘//’表示多个层级,即可以从任何位置开始定位 属性定位-例如://div[[@class=“zbtn znxt”]] 索引定位-例如://p[2] 取文本-例如://a/text() 取属性-例如://a/@href

定位搜索框

find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input") find_element_by_xpath("//input[@id='kw']") find_element_by_xpath("//*[@name='wd']") find_element_by_xpath("//input[@maxlength='255']")

find_element_by_css_selector() —利用CSS属性进行定位 CSS属性定位 一般class是用.标记,id是用#标记,直接写具体标签名。 在css里面下级标签元素用>连接,如果class里面有空格,空格用.进行连接

driver.find_element_by_css_selector(".s_ipt").send_keys("selenium") driver.find_element_by_css_selector("#su").click()

find_element_by_tag_name ()—通过标签名进行定位 需要注意的是:一种标签在一个页面里面会出现不止一次甚至大量出现

find_element_by_link_text() find_element_by_partial_link_text() 这两种定位方式是专门用于定位超链接的,也就是对应html页面中的a标签,括号里传的值就是a标签中的超链接文字,两者的区别在于一个是完整的超链接文字,一个是可以只写部分超链接文字。

注意:find_element_by…方法返回的是一个element对象,即一个标签,要在外面用.text()和.get_attribute()方法来分别对应于获取 文本信息 和 属性的信息,而不可以再表达式里面/text()和/@href这种

selenium–操作滚动条 from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Firefox() driver.get('https://www.baidu.com') driver.maximize_window() #最大化窗口 driver.find_element_by_id('kw').send_keys('python') driver.find_element_by_id('su').click() time.sleep(5) # 滚动条拉到指定位置(具体元素) target = driver.find_element_by_id("rs") driver.execute_script("arguments[0].scrollIntoView();", target) 将网页滚动到网页底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 向下滚动200个像素,鼠标位置也跟着变了 driver.execute_script("window.scrollBy(0,200)", "") time.sleep(3) driver.close() from selenium import webdriver import time #用来使程序运行歇息一会儿 #模拟登录百度 url = 'https://www.baidu.com' driver = webdriver.Chrome() driver.maximize_window()#最大化窗口 driver.get(url) # 找到登录按钮并点击 # login = driver.find_element_by_id('u1').find_elements_by_class_name("lb")[0] # login.click() login = driver.find_elements_by_css_selector("div[id=u1] a[class=lb]")[0] login.click() time.sleep(3) #找到用户名登录按钮 user_name_login = driver.find_elements_by_css_selector('p.tang-pass-footerBarULogin')[0] user_name_login.click() time.sleep(3) #输入账号与密码 user_name = driver.find_element_by_id("TANGRAM__PSP_10__userName") user_name.send_keys("your_user_name") time.sleep(3) password = driver.find_element_by_id("TANGRAM__PSP_10__password") password.send_keys("your_password") #找到并点击登录按钮 denglu=driver.find_element_by_id('TANGRAM__PSP_10__submit') denglu.click() driver.switch_to.frame用法

1.frame有ID 或者 name的情况 driver.switch_to.frame(“framename or id”)//frame直接跟id和名称均可

举例:假如有如下HTML代码:

iframe test

需要切入frame,方法如下:

from selenium import webdriver driver = webdriver.Chrome() driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0 # driver.switch_to.frame("frame1") # 2.用id来定位 # driver.switch_to.frame("name1") # 3.用name来定位 # driver.switch_to.frame(driver.find_element_by_id("frame1")) # 4.用WebElement对象来定位

嵌套frame的操作 举例:假如有如下HTML代码:

iframe test

(1)嵌套切入 frame2,需要一层一层切入,先切入 frame1 再切入 frame2 :

from selenium import webdriver driver = webdriver.Chrome() driver.switch_to.frame("frame1") #用id来定位 driver.switch_to.frame("frame2") #用id来定位

(2)从 frame2 再切回 frame1:

selenium 提供了一个方法能够从子frame切回到父frame,类似于后退;

driver.switch_to.parent_frame()

2.如果一个frame既没有id,也没有name的情况 // 定位frame位置,并选取frame frame=driver.findElement(By.xpath( “/html/body/div[2]/div[8]/div[2]/div[3]/div/div[2]/div/iframe” )) driver.switch_to.frame(frame)

3.跳出frame driver.switch_to.default_content()# 退出框架

操作元素方法

在定位完元素之后,我们要对定位好的元素进行操作 常见的操作元素方法如下:

clear 清除元素的内容send_keys 模拟按键输入click 点击元素submit 提交表单 Python代码实现 def login(base_url): driver = webdriver.Chrome(executable_path=r"C:\插件\chromedriver_win32\chromedriver.exe") driver.get(base_url) time.sleep(1) driver.execute_script('window.scrollTo(0, 200)') # 遇见了反爬行为,通过滚动页面对抗 username = "账号" password = "密码" driver.find_element_by_css_selector('#loginName').send_keys(username) time.sleep(1) driver.find_element_by_css_selector('#loginPassword').send_keys(password) time.sleep(1) # 点击登录 driver.find_element_by_css_selector('#loginAction').click() time.sleep(1) cookies = driver.get_cookies() # 获取cookie,列表形式 f1 = open('cookies.txt', 'w') f1.write(json.dumps(cookies)) f1.close() driver.close() if __name__ == '__main__': #模拟登陆-给定登陆的网址 base_url = "https://passport.weibo.cn/signin/login" login(base_url) print("新浪微博登陆成功!")


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3