#python #facebook #selenium
#python #Facebook #селен
Вопрос:
Я использовал python selenium для обхода сообщения FB в группе 4. все работает, когда я использовал старый макет FB, недавно FB заставил людей перейти на новый макет FB, вначале правила не такие строгие, я мог бы использовать расширение Chrome, чтобы заставить мою страницу FB вернуться к старому макету.(https://chrome.google.com/webstore/detail/old-layout-for-facebook/abmkkackbbimmdbfjdilpnfaegaeagge ) Однако, похоже, что правила становятся более строгими, FB не позволяет некоторым учетным записям пользователей возвращаться к старому макету, следовательно, моему скрипту python не удалось выполнить обход сообщения FB. как мне исправить код? Спасибо.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import re
import pandas as pd
import time
from datetime import datetime, timezone
import os
path1=os.path.abspath('.')
content=[]
link=[]
post_time=[]
like=[]
comment=[]
name=[]
group_name=[]
url={"蝦皮大學":"https://www.facebook.com/groups/958581774207367/?sorting_setting=CHRONOLOGICAL",
"【非官方】蝦皮購物交流區":"https://www.facebook.com/groups/726230870811573/?sorting_setting=CHRONOLOGICAL",
"蝦皮拍賣《賣家買家互相靠杯區》蝦皮拍賣黑名單":"https://www.facebook.com/groups/1665783630351784/?sorting_setting=CHRONOLOGICAL",
"靠北蝦皮":"https://www.facebook.com/permalink.php?story_fbid=1174954179312311amp;id=709450389196028amp;__tn__=-R"
}
# 登入PC版FB,並進入社團
# chrome_path=r'C:Usersbirdie.chengDesktopCrawl_FBchromedriver.exe'
chrome_path=path1 r"chromedriver.exe"
chrome_options = webdriver.ChromeOptions()
# chrome_options=Options()
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
prefs = {"profile.default_content_setting_values.notifications" : 2}
chrome_options.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(chrome_path,chrome_options=chrome_options)
driver.get("https://www.facebook.com/login.php?login_attempt=1amp;lwv=110")
# FB帳密
driver.find_element_by_id("email").send_keys("FB account")
driver.find_element_by_id("pass").send_keys("FB password")
driver.find_element_by_id("loginbutton").click()
for group in url:
driver.get(url[group])
# 自動將頁面捲動至最下方抓取資料
for j in range(1,6):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2)
page_text = (driver.page_source).encode('utf-8')
# 透過bs4解析
soup = BeautifulSoup(page_text,'lxml')
posts=soup.find_all('div',class_=re.compile('_3ccb'))
for post in posts:
# 文章內容
content_area=post.find('div',class_=re.compile('_5pbx'))
if content_area:
content.append(content_area.get_text())
else:
content.append('No text')
# 連結
link_area=post.find('a',class_='_5pcq')
post_link='https://www.facebook.com' link_area.get('href')
if group=="靠北蝦皮":
link.append(post_link[0:252]) # excel函式的字數限制為253
else:
link.append(post_link)
# 發文時間
time_area=post.find('abbr',class_=re.compile('_5ptz'))
ts=int(time_area.get('data-utime'))
utc_time = datetime.fromtimestamp(ts, timezone.utc) # 轉換可讀的時間格式
local_time = utc_time.astimezone() # 轉換成當地時間
post_time.append(local_time.strftime('%Y-%m-%d %H:%M:%S'))
# 按讚數
if group=="靠北蝦皮":
like_area=post.find('span',class_='_1g5v')
else:
like_area=post.find('span',class_='_3dlh')
if like_area:
like.append(like_area.string)
else:
like.append(0)
# 留言數
if group=="靠北蝦皮":
comment_area=post.find('a',class_='_ipm _-56')
else:
comment_area=post.find('a',class_='_3hg- _42ft')
if comment_area:
comment_number=re.findall("d ",comment_area.string)[0] # xx則留言 取數字
comment.append(comment_number)
else:
comment.append(0)
# PO文者
name_area=post.find('span',class_=re.compile('fwb'))
name.append(name_area.get_text())
# 社團名稱
group_name.append(group)
driver.close()
# 存成 dataframe
dic={
"Post_Time":post_time,
"Group":group_name,
"Post_Name":name,
"Post_Content":content,
"Like_Count":like,
"Comment_Count":comment,
"Link":link
}
df=pd.DataFrame(dic)
df['Link'] = '=HYPERLINK("' df['Link'] '","Link")'
# 寫入Google Sheet
import gspread
import gspread_dataframe as gd
from oauth2client.service_account import ServiceAccountCredentials
# Google 帳號登入
# json_path=r'C:Usersbirdie.chengDesktopCrawl_FBauth.json'
json_path=path1 r'auth.json'
scopes=['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name(json_path,scopes)
gc=gspread.authorize(credentials)
# 開啟並更新 Google Sheet
#wks = gc.open_by_key('1wyshxxkhsWB9hswi3_KBXgBORppE9-C3kapGNXYp4TE').get_worksheet(1)
wks = gc.open_by_key('1wyshxxkhsWB9hswi3_KBXgBORppE9-C3kapGNXYp4TE')
sheet=wks.sheet1
existing = gd.get_as_dataframe(sheet)
updated = existing.append(df,ignore_index=True,sort=False)
updated=updated.drop_duplicates(subset=['Post_Content'],keep='last')
updated=updated.drop_duplicates(subset=['Link'],keep='last')
updated['Post_Time']=pd.to_datetime(updated.Post_Time, format='%Y-%m-%d %H:%M:%S')
updated=updated.sort_values(by='Post_Time',ascending= False)
gd.set_with_dataframe(sheet, updated)
print("Complete")
# print(df.head())
Комментарии:
1. очистка на facebook запрещена, почему бы просто не использовать graph api вместо этого?
2. @luschnn, я отслеживаю и загружаю все сообщения в этих 4 группах fb в документ каждый день, поддерживает ли это graph api?
Ответ №1:
попробуйте использовать этот формат facebook https://m.facebook.com /…… или https://mbasic.facebook.com /…..