Facebook_scraper:Python获取FB用户的公开发帖【FaceBook系列 一】
????????說到Facebook,就不得不先提一嘴扎克伯格。
????????扎克伯格最讓人熟悉的梗和外號就是【蜥蜴人,機器人】:
我一看你就不是人,大威天龍!
????????但是小扎成立的Facebook儼然成為了規模不小的照片分享網站和知名廣告商之一。
????????當然,如此體量網站必然會產生不少的數據,Facebook也曾被竊取過不少的用戶信息。雖說如此,但是這次我們獲取的數據是公開的哦。
一、Facebook_scraper及其簡單的使用方式
????????Facebook_scraper是臉書的一個專門的爬取庫,可以不通過FB的api獲取公開的內容。????????
?詳情鏈接:facebook-scraper · PyPI
? ? ? ? 看一下人家給的使用方法:?
>>> from facebook_scraper import get_posts>>> for post in get_posts('nintendo', pages=1): ... print(post['text'][:50]) ... The final step on the road to the Super Smash Bros We’re headed to PAX East 3/28-3/31 with new games? ? ? ? 他這里獲取的是Facebook中任天堂發布的公開帖子。
????????其中Facebook_scraper的get_posts方法,傳入了一個'nintendo'的參數,在get_post方法中,就把'nintendo'湊成了鏈接:https://www.facebook.com/Nintendo/,get_posts就請求的這個鏈接獲取的數據。
? ? ? 人家例子返回的內容還是任天堂明星大亂斗,現在都是星之卡比了
? ? ? ? 第二個page參數則是設置了最大的返回數據條數,看看源碼:
# TODO: Deprecate `pages` in favor of `page_limit` since it is less confusing if 'pages' in kwargs:kwargs['page_limit'] = kwargs.pop('pages')?????????在執行的時候,page數過少的話會不返回數據的哦。(打碼的是打印出來的cookie,詳見下文)
? ? ? ? 返回的數據格式:
{'available': True,'comments': 459,'comments_full': None,'factcheck': None,'fetched_time': datetime.datetime(2021, 4, 20, 13, 39, 53, 651417),'image': 'https://scontent.fhlz2-1.fna.fbcdn.net/v/t1.6435-9/fr/cp0/e15/q65/58745049_2257182057699568_1761478225390731264_n.jpg?_nc_cat=111&ccb=1-3&_nc_sid=8024bb&_nc_ohc=ygH2fPmfQpAAX92ABYY&_nc_ht=scontent.fhlz2-1.fna&tp=14&oh=7a8a7b4904deb55ec696ae255fff97dd&oe=60A36717','images': ['https://scontent.fhlz2-1.fna.fbcdn.net/v/t1.6435-9/fr/cp0/e15/q65/58745049_2257182057699568_1761478225390731264_n.jpg?_nc_cat=111&ccb=1-3&_nc_sid=8024bb&_nc_ohc=ygH2fPmfQpAAX92ABYY&_nc_ht=scontent.fhlz2-1.fna&tp=14&oh=7a8a7b4904deb55ec696ae255fff97dd&oe=60A36717'],'is_live': False,'likes': 3509,'link': 'https://www.nintendo.com/amiibo/line-up/','post_id': '2257188721032235','post_text': 'Don’t let this diminutive version of the Hero of Time fool you, ''Young Link is just as heroic as his fully grown version! Young ''Link joins the Super Smash Bros. series of amiibo figures!\n''\n''https://www.nintendo.com/amiibo/line-up/','post_url': 'https://facebook.com/story.php?story_fbid=2257188721032235&id=119240841493711','reactions': {'haha': 22, 'like': 2657, 'love': 706, 'sorry': 1, 'wow': 123}, # if `extra_info` was set'reactors': None,'shared_post_id': None,'shared_post_url': None,'shared_text': '','shared_time': None,'shared_user_id': None,'shared_username': None,'shares': 441,'text': 'Don’t let this diminutive version of the Hero of Time fool you, ''Young Link is just as heroic as his fully grown version! Young Link ''joins the Super Smash Bros. series of amiibo figures!\n''\n''https://www.nintendo.com/amiibo/line-up/','time': datetime.datetime(2019, 4, 30, 5, 0, 1),'user_id': '119240841493711','username': 'Nintendo','video': None,'video_id': None,'video_thumbnail': None,'w3_fb_url': 'https://www.facebook.com/Nintendo/posts/2257188721032235'}? ? ? ?案例中打印的是返回數據中"text"字段中前50個字符。
???????當然,這個庫不僅僅就這一個方法。瀏覽了下源碼,發現了里面有封裝好多的對應的方法,比如爬取群眾group,圖片數據等等,后續的話會持續更新的,敬請期待。
二、設置Cookie
? ? ? ? 因為Facebook有著比較嚴格的登錄規定,所以的話你得需要獲取到登陸的cookie再能更方便的獲取數據。(親測這個好像不需要cookie也能獲取)
????????但是話都說到這個份上了我還是要把cookie這個東西講一講!
????????關于cookie的問題,文檔中也有所提及,我這就按官方和我自己的步驟綜合的講一下:
2.1、獲取cookie?
? ? ? ? 文檔第一條說獲取cookie的方式是使用瀏覽器的插件,chrome用Get cookies.txt插件,火狐用Cookie Quick Manager。因為我是chrome,就著重說一下Get cookies.txt:
? ? ? ? ?安裝好插件之后,你的瀏覽器的右上角會有這個東西:
沒有的自己調啊,瀏覽器自己設置嗷?
? ? ? ? 這是你再去訪問你的Facebook,插件圖標的下標會顯示數字,這就說明插件已經獲取到你的訪問Facebook的cookie了。?
?????????點開插件之后,點擊Export導出,會下載一個txt文件,這就是你的cookie導入本地的文件了。
2.2、讀取cookie文件并使用?
? ? ? ? 獲取到cookie之后呢,開始在方法里面調用了。
????????首先將cookie文件通過cookiejar里面的MozillaCookieJar方法將cookie文件轉成cookiejar類型,之后使用requests中的dict_from_cookiejar方法將cookiejar轉成cookiedict。
import requests from http import cookiejarfile = "cookies.txt" cookie = cookiejar.MozillaCookieJar() cookie.load(file) cookies = requests.utils.dict_from_cookiejar(cookie) print(cookies)?????????到這呢,基本上cookie已經處理完了。在Facebook_scraper里面有個set_cookies()方法,直接將cookiedict傳進去就完事兒了(附上源碼):
def set_cookies(cookies):if isinstance(cookies, str):if cookies == "from_browser":try:import browser_cookie3cookies = browser_cookie3.load(domain_name='.facebook.com')except:raise ModuleNotFoundError("browser_cookie3 must be installed to use browser cookies")else:try:cookies = parse_cookie_file(cookies)except ValueError as e:raise exceptions.InvalidCookies(f"Cookies are in an invalid format: {e}")elif isinstance(cookies, dict):cookies = cookiejar_from_dict(cookies)if cookies is not None:cookie_names = [c.name for c in cookies]missing_cookies = [c for c in ['c_user', 'xs'] if c not in cookie_names]if missing_cookies:raise exceptions.InvalidCookies(f"Missing cookies with name(s): {missing_cookies}")_scraper.session.cookies.update(cookies)if not _scraper.is_logged_in():raise exceptions.InvalidCookies(f"Cookies are not valid")? ? ? ? 附上整體的cookie整合代碼:
import requests from http import cookiejar import facebook_scraper as fbfile = "cookies.txt" cookie = cookiejar.MozillaCookieJar() cookie.load(file) cookies = requests.utils.dict_from_cookiejar(cookie) print(cookies) fb.set_cookies(cookies)三、代理設置
? ? ? ? 當然,在國內是沒法正常訪問的。
? ? ? ? 所以能獲取數據的方法有兩個:1,用海外的服務器部署服務,但是不保證你的IP連帶著你的賬戶被ban掉的風險。2,使用代理。
? ? ? ? 總之使用代理是比較安穩的方式。
? ? ? ? 我這邊使用的ipidea的代理,在寫這篇文章之間就試過了,很穩定(要不然這文章就沒法往下寫了)。新用戶可以白嫖流量哦,往期的文章有很詳細的使用教程!
?????????地址:http://www.ipidea.net/?utm-source=csdn&utm-keyword=?wb?
? ? ? ? Facebook_scraper里面有個方法,叫set_proxy()
def set_proxy(self, proxy):self.requests_kwargs.update({'proxies': {'http': proxy, 'https': proxy}})ip = self.get("http://lumtest.com/myip.json", headers={"Accept": "application/json"}).json()logger.debug(f"Proxy details: {ip}")? ? ? ? 可以發現,里面的代理格式已經寫好了,僅僅需要把代理設置成“http://域名:端口”這個樣式傳進去就可以了。帶賬號密碼的代理也是可以這么傳進去的。
? ? ? ? 傳入代理之后,會發現里面走了一個get請求,獲取你代理所在的IP地址便于之后的請求
? ? ? ? 附上整合的代碼:
import requests from http import cookiejar import facebook_scraper as fbfile = "cookies.txt" cookie = cookiejar.MozillaCookieJar() cookie.load(file) cookies = requests.utils.dict_from_cookiejar(cookie) print(cookies) proxy = getApiIp()#獲取代理的方法 fb.set_proxy(proxy) fb.set_cookies(cookies)四、總結
? ? ? ? 經過上述步驟之后,代理和cookie設置完畢后,就可以正常的去請求。附上總的整合代碼:
import requests from http import cookiejar import facebook_scraper as fb# api獲取ip def getApiIp():# 獲取且僅獲取一個ipapi_url = '獲取代理的地址'res = requests.get(api_url, timeout=5)try:if res.status_code == 200:api_data = res.json()['data'][0]proxies = f'http://{api_data["ip"]}:{api_data["port"]}'print(proxies)return proxieselse:print('獲取失敗')except:print('獲取失敗')def get_start():file = "cookies.txt"cookie = cookiejar.MozillaCookieJar()cookie.load(file)cookies = requests.utils.dict_from_cookiejar(cookie)print(cookies)proxy = getApiIp()fb.set_proxy(proxy)fb.set_cookies(cookies)for post in fb.get_posts('nintendo', pages=1,):print(post['text']) # if __name__ == '__main__':get_start()????????本期分享了Facebook_scraper這個下載庫,因為這個庫的教程真的是很少,于是寫下來分享一下。
? ? ? ? 最后說一句,Facebook內容雖然精彩,但是必須要擦亮眼睛,明辨是非。身處在信息繭房,也不能迷失自我。
總結
以上是生活随笔為你收集整理的Facebook_scraper:Python获取FB用户的公开发帖【FaceBook系列 一】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java填空题_JAVA填空题复习(有答
- 下一篇: 网页聊天室制作步骤分享