我决定尝试用python创建一个简单的网页抓取器脚本。作为一个小挑战,我决定创建一个脚本,该脚本将能够将我登录到Facebook并获取侧面显示的当前生日。我已经设法编写了一个脚本,可以将我登录到我的Facebook,但是我不知道如何获取显示的生日。
这是我的隐秘。
from selenium import webdriver
from time import sleep
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
usr = 'EMAIL'
pwd = 'PASSWORD'
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.facebook.com/')
print ("Opened facebook")
sleep(1)
username_box = driver.find_element_by_id('email')
username_box.send_keys(usr)
print ("Email Id entered")
sleep(1)
password_box = driver.find_element_by_id('pass')
password_box.send_keys(pwd)
print ("Password entered")
login_box = driver.find_element_by_id('u_0_b')
login_box.click()
print ("Login Sucessfull")
print ("Fetched needed data")
input('Press anything to quit')
driver.quit()
print("Finished")
这是我第一次创建这种类型的脚本。我的假设是,我应该遍历"jsc_c_3d"div 元素的子元素,直到我到达显示的生日。此外,每次刷新页面时,此元素的 id 都会更改。谁能告诉我这是如何完成的,或者这是否是我应该继续解决这个问题的正确方法? 期待元素后的生日div:
<div class="" id="jsc_c_3d">
<div class="j83agx80 cbu4d94t ew0dbk1b irj2b8pg">
<div class="qzhwtbm6 knvmm38d"><span class="oi732d6d ik7dh3pa d2edcug0 qv66sw1b c1et5uql
a8c37x1j muag1w35 enqfppq2 jq4qci2q a3bd9o3v knj5qynh oo9gr5id hzawbc8m" dir="auto">
<strong>Bobi Mitrevski</strong>
and
<strong>Trajce Tusev</strong> have birthdays today.</span></div></div></div>
您是正确的,您需要遍历jsc_c_3d
的内部元素才能提取您想要的生日。但是,如果 id 值是动态的,则整个automated web-scraping
都是一个问题,因此每次都会更改。在这种情况下,文本解析器(如bs4
(将完成这项工作。
使用bs4
方法,您只需从DOM
中提取相关的div
标签,然后就可以解析数据以获取所需的内容。
更一般地说,这个问题可以使用Facebook-API
来解决,它可以像
import facebook
token = 'a token' # token omitted here, this is the same token when I use in https://developers.facebook.com/tools/explorer/
graph = facebook.GraphAPI(token)
args = {'fields' : 'birthday,name' }
friends = graph.get_object("me/friends",**args)