├── Execution Guideline ├── Facebook Graph API Guidelines ├── Facebook_scraper.py ├── Facebook_scraper_insight.py ├── Readme ├── fifaworldcup_feed_20180620.csv ├── fifaworldcup_post_comments_20180620.csv └── fifaworldcup_reply_comments_20180620.csv /Execution Guideline: -------------------------------------------------------------------------------- 1 | Script Execution Guidelines 2 | Version 1: 3 | Token : Use the graph access token generated using your Facebook account 4 | Usage : python Facebook_scraper_insight.py techinsider YYYY-MM-DD 5 | Update the below parameters in the program before execution 6 | token_input = 'Paste your access token string here from the Graph API' 7 | target_page_input = 'Enter the facebook page name e.g.(techinsider)' 8 | date_since_input = 'Enter the date from which data is required (YYYY-MM-DD)' 9 | 10 | 11 | Version 2: 12 | Token : Use the page specific access token generated by selecting required page 13 | Usage : python Facebook_scraper_insight.py techinsider YYYY-MM-DD 14 | Update the below parameters in the program before execution 15 | token_input = 'Paste your access token string here from the Graph API' 16 | target_page_input = 'Enter the facebook page name' 17 | date_since_input = 'Enter the date from which data is required' 18 | 19 | For Python 2.7 version Note changes the below code: 20 | #f = open(json_path, "w") # This code is for python 2.7 21 | f = open(json_path, "w", encoding='utf-8') #In Python 3, we need to specify encoding when open a file 22 | 23 | -------------------------------------------------------------------------------- /Facebook Graph API Guidelines: -------------------------------------------------------------------------------- 1 | The Facebook Graph API guidelines 2 | 3 | Overview to Facebook Graph API is given on the below link: 4 | https://towardsdatascience.com/how-to-use-facebook-graph-api-and-extract-data-using-python-1839e19d6999 5 | 6 | For step by step understanding of the Facebook Graph API, please refer below link: 7 | https://towardsdatascience.com/how-to-use-facebook-graph-api-and-extract-data-using-python-1839e19d6999 8 | 9 | 10 | -------------------------------------------------------------------------------- /Facebook_scraper.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Usage : python Facebook_scraper_insight.py techinsider YYYY-MM-DD 4 | Update the below parameters in the program before execution 5 | token_input = 'Paste your access token string here from the Graph API' 6 | target_page_input = 'Enter the facebook page name' 7 | date_since_input = 'Enter the date from which data is required' 8 | Script runs on Python 2/3 with minor changes which are commented in the program 9 | 10 | @author: sahil 11 | """ 12 | 13 | import requests 14 | import json 15 | import sys 16 | import time 17 | import datetime 18 | ''' 19 | reloading sys for utf8 encoding is for Python 2.7 20 | This line should be removed for Python 3 21 | In Python 3, we need to specify encoding when open a file 22 | f = open("file.csv", encoding='utf-8') 23 | ''' 24 | #reload(sys) 25 | #sys.setdefaultencoding('utf8') 26 | 27 | class FacebookScraper: 28 | ''' 29 | FacebookScraper class to scrape facebook info 30 | ''' 31 | 32 | def __init__(self, token): 33 | self.token = token 34 | 35 | @staticmethod 36 | def epochtime(date_string): 37 | '''Enter date_string in 2000-01-01 format and convert to epochtime for GET request''' 38 | try: 39 | epoch = int(time.mktime(time.strptime(date_string, '%Y-%m-%d'))) 40 | return epoch 41 | except ValueError: 42 | print('Invalid string format. Make sure to use %Y-%m-%d') 43 | quit() 44 | 45 | def extract_feed_data(self, target_page, offset, fields, json_path, date_string): 46 | """This function will get the feed data""" 47 | 48 | requrl = "https://graph.facebook.com/v2.10/{}/feed".format(target_page) 49 | param = dict() 50 | param["access_token"] = self.token 51 | param["limit"] = "100" 52 | param["offset"] = offset 53 | param["fields"] = fields 54 | param["since"] = self.epochtime(date_string) 55 | r = requests.get(requrl, param) 56 | data = json.loads(r.text) 57 | f = open(json_path, "w", encoding='utf-8') #In Python 3, we need to specify encoding when open a file 58 | #f = open(json_path, "w") 59 | f.write(json.dumps(data, indent=4)) 60 | print("json file has been generated") 61 | 62 | f.close() 63 | 64 | return data 65 | 66 | def create_table_header(self, list_rows, file_path, page_name, table_name): 67 | '''This method will create a table according to header and table name''' 68 | 69 | if table_name == "feed" : 70 | header = ["page_name", "id", "type", "created_time", "message", "name","description","actions_name","share_count","comment_count","like_count","sad_count","wow_count","love_count","haha_count","angry_count"] 71 | elif table_name == "comment_replies": 72 | header = ["page_name","parent_comment_id","parent_comment_message","reply_comment_message","comment_id", "created_time", "comment_like_cnt"] 73 | elif table_name == "comments": 74 | header = ["page_name", "post_id", "created_time", "message",\ 75 | "reply_cmt_cnt","comments_like_cnt","comment_haha_cnt","comment_sad_cnt","comment_wow_cnt","comment_love_cnt","comment_angry_cnt","message_id"] 76 | print("Specified table name is not valid.") 77 | else: 78 | quit() 79 | 80 | file = open(file_path, 'w',encoding='utf-8') 81 | file.write(','.join(header) + '\n') 82 | for i in list_rows: 83 | file.write('"' + page_name + '",') 84 | for j in range(len(i)): 85 | row_string = '' 86 | if j < len(i) -1 : 87 | row_string += '"' + str(i[j]).replace('"', '').replace('\n', '') + '"' + ',' 88 | else: 89 | row_string += '"' + str(i[j]).replace('"', '').replace('\n', '') + '"' + '\n' 90 | file.write(row_string) 91 | file.close() 92 | print("Generated {} table csv File for {}".format(table_name, page_name)) 93 | 94 | def extract_feed_data(self, response_json_list): 95 | '''This method takes response json data and convert to csv''' 96 | print("extract_feed_data-----") 97 | list_all = [] 98 | for response_json in response_json_list: 99 | data = response_json["data"] 100 | #print("FEED data--",data) 101 | for i in range(len(data)): 102 | list_row = [] 103 | row = data[i] 104 | id = row["id"] 105 | try: 106 | type = row["type"] 107 | except KeyError: 108 | type = "" 109 | try: 110 | created_time = row["created_time"] 111 | except KeyError: 112 | created_time = "" 113 | try: 114 | message = row["message"] 115 | except KeyError: 116 | message = "" 117 | try: 118 | name = row["name"] 119 | except KeyError: 120 | name = "" 121 | try: 122 | description = row["description"] 123 | except KeyError: 124 | description = "" 125 | try: 126 | actions_link = row["actions"][0]["link"] 127 | except KeyError: 128 | actions_link = "" 129 | try: 130 | share_count = row["shares"]["count"] 131 | except KeyError: 132 | share_count = "" 133 | try: 134 | comment_count = row["comments"]["summary"]["total_count"] 135 | except KeyError: 136 | comment_count = "" 137 | try: 138 | like_count = row["likes"]["summary"]["total_count"] 139 | except KeyError: 140 | like_count = "" 141 | try: 142 | sad_count = row["sad"]["summary"]["total_count"] 143 | except KeyError: 144 | sad_count = "" 145 | try: 146 | wow_count = row["wow"]["summary"]["total_count"] 147 | except KeyError: 148 | wow_count = "" 149 | try: 150 | love_count = row["love"]["summary"]["total_count"] 151 | except KeyError: 152 | love_count = "" 153 | try: 154 | haha_count = row["haha"]["summary"]["total_count"] 155 | except KeyError: 156 | haha_count = "" 157 | try: 158 | angry_count = row["angry"]["summary"]["total_count"] 159 | except KeyError: 160 | angry_count = "" 161 | 162 | list_row.extend((id, type, created_time, message, name, \ 163 | description, actions_link, share_count, comment_count, like_count,sad_count,wow_count,love_count,haha_count,angry_count)) 164 | list_all.append(list_row) 165 | 166 | return list_all 167 | 168 | def extract_comments_data(self, response_json_list): 169 | '''Function to extract post comment data''' 170 | list_all = [] 171 | for response_json in response_json_list: 172 | data = response_json["data"] 173 | # like_list = [] 174 | for i in range(len(data)): 175 | #print("datalen--",len(data)) 176 | row = data[i] 177 | post_id = row["id"] 178 | try: 179 | comment_count = row["comments"]["summary"]["total_count"] 180 | #print("comment_count---",comment_count) 181 | except KeyError: 182 | comment_count = 0 183 | if comment_count > 0: 184 | comments = row["comments"]["data"] 185 | for comment in comments: 186 | row_list = [] 187 | created_time = comment["created_time"] 188 | message = comment["message"].encode('latin1', 'ignore') 189 | reply_cmt_cnt=comment["comment_count"] 190 | comment_like_cnt = comment["like_count"] 191 | comment_haha_cnt = comment["haha"]["summary"]["total_count"] 192 | comment_sad_cnt = comment["sad"]["summary"]["total_count"] 193 | comment_wow_cnt = comment["wow"]["summary"]["total_count"] 194 | comment_love_cnt = comment["love"]["summary"]["total_count"] 195 | comment_angry_cnt = comment["angry"]["summary"]["total_count"] 196 | message_id = comment["id"] 197 | row_list.extend((post_id, created_time, message,\ 198 | reply_cmt_cnt,comment_like_cnt,comment_haha_cnt,comment_sad_cnt,comment_wow_cnt,comment_love_cnt,comment_angry_cnt,message_id)) 199 | #print(row_list) 200 | list_all.append(row_list) 201 | 202 | # Check if the next link exists 203 | try: 204 | next_link = row["comments"]["paging"]["next"] 205 | print("Next link for comments data") 206 | except KeyError: 207 | next_link = None 208 | continue 209 | 210 | if next_link is not None: 211 | r = requests.get(next_link.replace("limit=200", "limit=200")) 212 | comments_data = json.loads(r.text) 213 | while True: 214 | for i in range(len(comments_data["data"])): 215 | row_list = [] 216 | comment = comments_data["data"][i] 217 | created_time = comment["created_time"] 218 | message = comment["message"].encode('latin1', 'ignore') 219 | reply_cmt_cnt=comment["comment_count"] 220 | comment_like_cnt = comment["like_count"] 221 | comment_haha_cnt = comment["haha"]["summary"]["total_count"] 222 | comment_sad_cnt = comment["sad"]["summary"]["total_count"] 223 | comment_wow_cnt = comment["wow"]["summary"]["total_count"] 224 | comment_love_cnt = comment["love"]["summary"]["total_count"] 225 | comment_angry_cnt = comment["angry"]["summary"]["total_count"] 226 | message_id = comment["id"] 227 | row_list.extend((post_id, created_time, message,\ 228 | reply_cmt_cnt,comment_like_cnt,comment_haha_cnt,comment_sad_cnt,comment_wow_cnt,comment_love_cnt,comment_angry_cnt,message_id)) 229 | list_all.append(row_list) 230 | try: 231 | next = comments_data["paging"]["next"] 232 | r = requests.get(next.replace("limit=200", "limit=200")) 233 | comments_data = json.loads(r.text) 234 | except KeyError: 235 | break 236 | return list_all 237 | 238 | def extract_comment_replies_data(self, response_json_list): 239 | '''This will get the replies to the comments posted on FB''' 240 | print("extract_comment_replies_data-----") 241 | list_all = [] 242 | for response_json in response_json_list: 243 | data = response_json["data"] 244 | #print("data len---",len(data)) 245 | for i in range(len(data)): 246 | row = data[i] 247 | comments=row["comments"]["data"] 248 | for j in range(len(comments)): 249 | cmt_data=comments[j] 250 | try: 251 | comment_count=cmt_data["comment_count"] 252 | except KeyError: 253 | comment_count = 0 254 | if comment_count > 0: 255 | #print("comment_count",comment_count) 256 | try: 257 | reply_cmt = cmt_data["comments"]["data"] 258 | except: 259 | print("Breaking loop out of reply cmt") 260 | break 261 | for k in range(len(reply_cmt)): 262 | #print("Reply comment message--",reply_cmt[k]["message"]) 263 | row_list = [] 264 | parent_comment_id = cmt_data["id"] 265 | parent_comment_message = cmt_data["message"] 266 | reply_comment_message = reply_cmt[k]["message"] 267 | comment_id = reply_cmt[k]["id"] 268 | created_time = reply_cmt[k]["created_time"] 269 | comment_like_cnt = reply_cmt[k]["like_count"] 270 | 271 | row_list.extend((parent_comment_id, parent_comment_message, reply_comment_message,comment_id,created_time,comment_like_cnt)) 272 | list_all.append(row_list) 273 | 274 | # Check if the next link exists 275 | try: 276 | next_link = cmt_data["comments"]["paging"]["next"] 277 | except KeyError: 278 | next_link = None 279 | continue 280 | else: 281 | print("No reply comments in the post") 282 | break 283 | 284 | if next_link is not None: 285 | r = requests.get(next_link.replace("limit=100", "limit=100")) 286 | comments_data = json.loads(r.text) 287 | while True: 288 | for i in range(len(comments_data["data"])): 289 | row_list = [] 290 | parent_comment_id = cmt_data["id"] 291 | parent_comment_message = cmt_data["message"] 292 | reply_comment_message = reply_cmt[k]["message"] 293 | comment_id = reply_cmt[k]["id"] 294 | created_time = reply_cmt[k]["created_time"] 295 | comment_like_cnt = reply_cmt[k]["like_count"] 296 | row_list.extend((parent_comment_id, parent_comment_message, reply_comment_message,comment_id,created_time,comment_like_cnt)) 297 | list_all.append(row_list) 298 | try: 299 | next = comments_data["paging"]["next"] 300 | r = requests.get(next.replace("limit=100", "limit=100")) 301 | comments_data = json.loads(r.text) 302 | except KeyError: 303 | #print("Comments for the post {} completed".format(post_id)) 304 | break 305 | return list_all 306 | 307 | if __name__ == "__main__": 308 | now = datetime.datetime.now() 309 | current_day=now.strftime("%Y%m%d") 310 | # token_input = sys.argv[1] 311 | #target_page_input = sys.argv[1] 312 | #date_since_input = sys.argv[2] 313 | token_input = ''Paste your access token string here from the Graph API'' 314 | target_page_input = 'Enter the facebook page name' 315 | date_since_input = 'Enter the date from which data is required' 316 | json_path_input = target_page_input+"_data_"+current_day+".json" 317 | csv_feed_path_input = target_page_input+"_feed_"+current_day+".csv" 318 | csv_reply_comment_path_input = target_page_input+"_reply_comments_"+current_day+".csv" 319 | csv_comments_path_input = target_page_input+"_post_comments_"+current_day+".csv" 320 | 321 | # Get request parameters 322 | field_input='id,created_time,name,message,comments.summary(true).limit(200){created_time,message,reactions.type(SAD).summary(1).as(sad),reactions.type(WOW).summary(1).as(wow),reactions.type(LOVE).summary(1).as(love),reactions.type(HAHA).summary(1).as(haha),reactions.type(ANGRY).summary(1).as(angry),id,like_count,comment_count,comments.limit(200){message,created_time,like_count,comments.limit(200),reactions.type(SAD).summary(1).as(sad),reactions.type(WOW).summary(1).as(wow),reactions.type(LOVE).summary(1).as(love),reactions.type(HAHA).summary(1).as(haha),reactions.type(ANGRY).summary(1).as(angry)}},shares,type,link,actions,place,targeting,feed_targeting,scheduled_publish_time,backdated_time,description,likes.summary(true),reactions.type(SAD).summary(1).as(sad),reactions.type(WOW).summary(1).as(wow),reactions.type(LOVE).summary(1).as(love),reactions.type(HAHA).summary(1).as(haha),reactions.type(ANGRY).summary(1).as(angry)' 323 | 324 | fb = FacebookScraper(token_input) 325 | 326 | print("Get request parameters--",field_input) 327 | 328 | offset = 0 329 | json_list = [] 330 | while True: 331 | path = str(offset) + "_" + json_path_input 332 | #print("path--",path) 333 | try: 334 | data = fb.extract_feed_data(target_page_input, str(offset), field_input, path, date_since_input) 335 | check = data['data'] 336 | if (len(check) >= 100): 337 | json_list.append(data) 338 | offset += 100 339 | print("Offset--",offset) 340 | else: 341 | json_list.append(data) 342 | print("End of loop for obtaining more than 100 feed records.") 343 | break 344 | except KeyError: 345 | print("Error with get request.") 346 | quit() 347 | 348 | print("Create feed table") 349 | feed_table_list = fb.extract_feed_data(json_list) 350 | #print(feed_table_list[0]) 351 | fb.create_table_header(feed_table_list, csv_feed_path_input, target_page_input, "feed") 352 | print("Feed generated") 353 | 354 | print("Create Comment table") 355 | comments_table_list = fb.extract_comments_data(json_list) 356 | #print(comments_table_list[0]) 357 | fb.create_table_header(comments_table_list, csv_comments_path_input, target_page_input, "comments") 358 | print("comments_table_list generated") 359 | 360 | print("Create Comment replies table") 361 | comment_replies_list = fb.extract_comment_replies_data(json_list) 362 | #print(comment_replies_list[0]) 363 | fb.create_table_header(comment_replies_list, csv_reply_comment_path_input, target_page_input, "comment_replies") 364 | print("comments_table_list generated") 365 | 366 | 367 | 368 | 369 | -------------------------------------------------------------------------------- /Facebook_scraper_insight.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Mon Feb 19 15:26:26 2018 4 | Usage : python Facebook_scraper_insight.py techinsider YYYY-MM-DD 5 | Update the below parameters in the program before execution 6 | token_input = 'Paste your access token string here from the Graph API' 7 | target_page_input = 'Enter the facebook page name' 8 | date_since_input = 'Enter the date from which data is required' 9 | Script runs on Python 2/3 with minor changes which are commented in the program 10 | Note: Need an Admin level access to the page on the Facebook to execute this script and collect the page insights 11 | 12 | @author: sahil 13 | """ 14 | 15 | import requests 16 | import json 17 | import sys 18 | import time 19 | import datetime 20 | ''' 21 | reloading sys for utf8 encoding is for Python 2.7 22 | This line should be removed for Python 3 23 | In Python 3, we need to specify encoding when open a file 24 | f = open("file.csv", encoding='utf-8') 25 | ''' 26 | #reload(sys) 27 | #sys.setdefaultencoding('utf8') 28 | 29 | class FacebookScraper: 30 | ''' 31 | FacebookScraper class to scrape facebook info 32 | ''' 33 | 34 | def __init__(self, token): 35 | self.token = token 36 | 37 | @staticmethod 38 | def extract_to_epochtime(date_string): 39 | '''Enter date_string in 2000-01-01 format and convert to epochtime for GET request''' 40 | try: 41 | epoch = int(time.mktime(time.strptime(date_string, '%Y-%m-%d'))) 42 | return epoch 43 | except ValueError: 44 | print('Invalid string format. Make sure to use %Y-%m-%d') 45 | quit() 46 | 47 | def get_feed_data(self, target_page, offset, fields, json_path, date_string): 48 | """This function will get the feed data""" 49 | 50 | url = "https://graph.facebook.com/v2.10/{}/feed".format(target_page) 51 | param = dict() 52 | param["access_token"] = self.token 53 | param["limit"] = "100" 54 | param["offset"] = offset 55 | param["fields"] = fields 56 | param["since"] = self.extract_to_epochtime(date_string) 57 | #print("PARAMETER---",param) 58 | #print("URL---",url) 59 | r = requests.get(url, param) 60 | data = json.loads(r.text) 61 | f = open(json_path, "w", encoding='utf-8') #In Python 3, we need to specify encoding when open a file 62 | #f = open(json_path, "w") # This code is for python 2.7 63 | f.write(json.dumps(data, indent=4)) 64 | print("json file has been generated") 65 | 66 | f.close() 67 | 68 | return data 69 | 70 | def create_table_header(self, list_rows, file_path, page_name, table_name): 71 | '''This method will create a table according to header and table name''' 72 | 73 | if table_name == "feed" : 74 | header = ["page_name", "id", "type", "created_time", "message", "lifetime_post_impressions", "lifetime_post_impressions_unique", "lifetime_post_consumptions", "lifetime_post_consumptions_unique", "name", "description", "actions_name", "share_count", "comment_count", "like_count", "sad_count", "wow_count", "love_count", "haha_count", "angry_count"] 75 | elif table_name == "comment_replies": 76 | header = ["page_name", "parent_comment_id", "parent_comment_message", "reply_comment_message", "comment_id", "created_time", "comment_like_cnt"] 77 | elif table_name == "comments": 78 | header = ["page_name", "post_id", "created_time", "message", "reply_cmt_cnt", "comments_like_cnt", "comment_haha_cnt", "comment_sad_cnt", "comment_wow_cnt", "comment_love_cnt", "comment_angry_cnt", "message_id"] 79 | print("Specified table name is not valid.") 80 | else: 81 | quit() 82 | 83 | file = open(file_path, 'w',encoding='utf-8') 84 | #file = open(file_path, 'w') 85 | file.write(','.join(header) + '\n') 86 | for i in list_rows: 87 | file.write('"' + page_name + '",') 88 | for j in range(len(i)): 89 | row_string = '' 90 | if j < len(i) -1 : 91 | row_string += '"' + str(i[j]).replace('"', '').replace('\n', '') + '"' + ',' 92 | else: 93 | row_string += '"' + str(i[j]).replace('"', '').replace('\n', '') + '"' + '\n' 94 | file.write(row_string) 95 | file.close() 96 | print("Generated {} table csv File for {}".format(table_name, page_name)) 97 | 98 | def extract_feed_data(self, response_json_list): 99 | '''This method takes response json data and convert to csv''' 100 | print("extract_feed_data-----") 101 | list_all = [] 102 | for response_json in response_json_list: 103 | data = response_json["data"] 104 | #print("FEED data--",data) 105 | for i in range(len(data)): 106 | list_row = [] 107 | row = data[i] 108 | id = row["id"] 109 | try: 110 | type = row["type"] 111 | except KeyError: 112 | type = "" 113 | try: 114 | created_time = row["created_time"] 115 | except KeyError: 116 | created_time = "" 117 | try: 118 | message = row["message"] 119 | except KeyError: 120 | message = "" 121 | try: 122 | lifetime_post_impressions = row["insights"]["data"][0]["values"][0]["value"] 123 | except KeyError: 124 | lifetime_post_impressions = "" 125 | try: 126 | lifetime_post_impressions_unique = row["insights"]["data"][1]["values"][0]["value"] 127 | except KeyError: 128 | lifetime_post_impressions_unique = "" 129 | try: 130 | lifetime_post_consumptions = row["insights"]["data"][2]["values"][0]["value"] 131 | except KeyError: 132 | lifetime_post_consumptions = "" 133 | try: 134 | lifetime_post_consumptions_unique = row["insights"]["data"][3]["values"][0]["value"] 135 | except KeyError: 136 | lifetime_post_consumptions_unique = "" 137 | try: 138 | name = row["name"] 139 | except KeyError: 140 | name = "" 141 | try: 142 | description = row["description"] 143 | except KeyError: 144 | description = "" 145 | try: 146 | actions_link = row["actions"][0]["link"] 147 | except KeyError: 148 | actions_link = "" 149 | try: 150 | share_count = row["shares"]["count"] 151 | except KeyError: 152 | share_count = "" 153 | try: 154 | comment_count = row["comments"]["summary"]["total_count"] 155 | except KeyError: 156 | comment_count = "" 157 | try: 158 | like_count = row["likes"]["summary"]["total_count"] 159 | except KeyError: 160 | like_count = "" 161 | try: 162 | sad_count = row["sad"]["summary"]["total_count"] 163 | except KeyError: 164 | sad_count = "" 165 | try: 166 | wow_count = row["wow"]["summary"]["total_count"] 167 | except KeyError: 168 | wow_count = "" 169 | try: 170 | love_count = row["love"]["summary"]["total_count"] 171 | except KeyError: 172 | love_count = "" 173 | try: 174 | haha_count = row["haha"]["summary"]["total_count"] 175 | except KeyError: 176 | haha_count = "" 177 | try: 178 | angry_count = row["angry"]["summary"]["total_count"] 179 | except KeyError: 180 | angry_count = "" 181 | 182 | list_row.extend((id, type, created_time, message,lifetime_post_impressions,lifetime_post_impressions_unique,lifetime_post_consumptions,lifetime_post_consumptions_unique, name,description, actions_link, share_count, comment_count, like_count,sad_count,wow_count,love_count,haha_count,angry_count)) 183 | list_all.append(list_row) 184 | 185 | return list_all 186 | 187 | def extract_comments_data(self, response_json_list): 188 | '''Function to extract post comment data''' 189 | list_all = [] 190 | for response_json in response_json_list: 191 | data = response_json["data"] 192 | # like_list = [] 193 | for i in range(len(data)): 194 | #print("datalen--",len(data)) 195 | row = data[i] 196 | post_id = row["id"] 197 | try: 198 | comment_count = row["comments"]["summary"]["total_count"] 199 | #print("comment_count---",comment_count) 200 | except KeyError: 201 | comment_count = 0 202 | if comment_count > 0: 203 | comments = row["comments"]["data"] 204 | for comment in comments: 205 | row_list = [] 206 | created_time = comment["created_time"] 207 | message = comment["message"].encode('latin1', 'ignore') 208 | reply_cmt_cnt=comment["comment_count"] 209 | comment_like_cnt = comment["like_count"] 210 | comment_haha_cnt = comment["haha"]["summary"]["total_count"] 211 | comment_sad_cnt = comment["sad"]["summary"]["total_count"] 212 | comment_wow_cnt = comment["wow"]["summary"]["total_count"] 213 | comment_love_cnt = comment["love"]["summary"]["total_count"] 214 | comment_angry_cnt = comment["angry"]["summary"]["total_count"] 215 | message_id = comment["id"] 216 | row_list.extend((post_id, created_time, message,\ 217 | reply_cmt_cnt,comment_like_cnt,comment_haha_cnt,comment_sad_cnt,comment_wow_cnt,comment_love_cnt,comment_angry_cnt,message_id)) 218 | #print(row_list) 219 | list_all.append(row_list) 220 | 221 | # Check if the next link exists 222 | try: 223 | next_link = row["comments"]["paging"]["next"] 224 | print("Next link for comments data") 225 | except KeyError: 226 | next_link = None 227 | continue 228 | 229 | if next_link is not None: 230 | r = requests.get(next_link.replace("limit=200", "limit=200")) 231 | comments_data = json.loads(r.text) 232 | while True: 233 | for i in range(len(comments_data["data"])): 234 | row_list = [] 235 | comment = comments_data["data"][i] 236 | created_time = comment["created_time"] 237 | message = comment["message"].encode('latin1', 'ignore') 238 | reply_cmt_cnt=comment["comment_count"] 239 | comment_like_cnt = comment["like_count"] 240 | comment_haha_cnt = comment["haha"]["summary"]["total_count"] 241 | comment_sad_cnt = comment["sad"]["summary"]["total_count"] 242 | comment_wow_cnt = comment["wow"]["summary"]["total_count"] 243 | comment_love_cnt = comment["love"]["summary"]["total_count"] 244 | comment_angry_cnt = comment["angry"]["summary"]["total_count"] 245 | message_id = comment["id"] 246 | row_list.extend((post_id, created_time, message,\ 247 | reply_cmt_cnt,comment_like_cnt,comment_haha_cnt,comment_sad_cnt,comment_wow_cnt,comment_love_cnt,comment_angry_cnt,message_id)) 248 | list_all.append(row_list) 249 | try: 250 | next = comments_data["paging"]["next"] 251 | r = requests.get(next.replace("limit=200", "limit=200")) 252 | comments_data = json.loads(r.text) 253 | except KeyError: 254 | break 255 | return list_all 256 | 257 | def extract_comment_replies_data(self, response_json_list): 258 | '''This will get the replies to the comments posted on FB''' 259 | print("extract_comment_replies_data-----") 260 | list_all = [] 261 | for response_json in response_json_list: 262 | data = response_json["data"] 263 | #print("data len---",len(data)) 264 | for i in range(len(data)): 265 | row = data[i] 266 | comments=row["comments"]["data"] 267 | for j in range(len(comments)): 268 | cmt_data=comments[j] 269 | try: 270 | comment_count=cmt_data["comment_count"] 271 | except KeyError: 272 | comment_count = 0 273 | if comment_count > 0: 274 | #print("comment_count",comment_count) 275 | try: 276 | reply_cmt = cmt_data["comments"]["data"] 277 | except: 278 | print("Breaking loop out of reply cmt") 279 | break 280 | for k in range(len(reply_cmt)): 281 | #print("Reply comment message--",reply_cmt[k]["message"]) 282 | row_list = [] 283 | parent_comment_id = cmt_data["id"] 284 | parent_comment_message = cmt_data["message"] 285 | reply_comment_message = reply_cmt[k]["message"] 286 | comment_id = reply_cmt[k]["id"] 287 | created_time = reply_cmt[k]["created_time"] 288 | comment_like_cnt = reply_cmt[k]["like_count"] 289 | 290 | row_list.extend((parent_comment_id, parent_comment_message, reply_comment_message,comment_id,created_time,comment_like_cnt)) 291 | list_all.append(row_list) 292 | 293 | # Check if the next link exists 294 | try: 295 | next_link = cmt_data["comments"]["paging"]["next"] 296 | except KeyError: 297 | next_link = None 298 | continue 299 | else: 300 | print("No reply comments in the post") 301 | break 302 | 303 | if next_link is not None: 304 | r = requests.get(next_link.replace("limit=100", "limit=100")) 305 | comments_data = json.loads(r.text) 306 | while True: 307 | for i in range(len(comments_data["data"])): 308 | row_list = [] 309 | #comment = comments_data["data"][i] 310 | #print("Next loop comment data",comment) 311 | print("Next loop reply comment data ") 312 | parent_comment_id = cmt_data["id"] 313 | parent_comment_message = cmt_data["message"] 314 | reply_comment_message = reply_cmt[k]["message"] 315 | comment_id = reply_cmt[k]["id"] 316 | created_time = reply_cmt[k]["created_time"] 317 | comment_like_cnt = reply_cmt[k]["like_count"] 318 | row_list.extend((parent_comment_id, parent_comment_message, reply_comment_message,comment_id,created_time,comment_like_cnt)) 319 | list_all.append(row_list) 320 | try: 321 | next = comments_data["paging"]["next"] 322 | r = requests.get(next.replace("limit=100", "limit=100")) 323 | comments_data = json.loads(r.text) 324 | except KeyError: 325 | #print("Comments for the post {} completed".format(post_id)) 326 | break 327 | return list_all 328 | 329 | if __name__ == "__main__": 330 | now = datetime.datetime.now() 331 | current_day=now.strftime("%Y%m%d") 332 | # token_input = sys.argv[1] 333 | #target_page_input = sys.argv[1] 334 | #date_since_input = sys.argv[2] 335 | token_input = 'Paste your access token string here from the Graph API' 336 | target_page_input = 'Enter the facebook page name' 337 | date_since_input = 'Enter the date from which data is required' 338 | json_path_input = target_page_input+"_data_"+current_day+".json" 339 | csv_feed_path_input = target_page_input+"_feed_"+current_day+".csv" 340 | csv_reply_comment_path_input = target_page_input+"_reply_comments_"+current_day+".csv" 341 | csv_comments_path_input = target_page_input+"_post_comments_"+current_day+".csv" 342 | 343 | # Get request parameters 344 | field_input='id,created_time,name,message,insights.metric(post_impressions,post_impressions_unique,post_consumptions,post_consumptions_unique),comments.summary(true).limit(200){created_time,message,reactions.type(SAD).summary(1).as(sad),reactions.type(WOW).summary(1).as(wow),reactions.type(LOVE).summary(1).as(love),reactions.type(HAHA).summary(1).as(haha),reactions.type(ANGRY).summary(1).as(angry),id,like_count,comment_count,comments.limit(200){message,created_time,like_count,comments.limit(200),reactions.type(SAD).summary(1).as(sad),reactions.type(WOW).summary(1).as(wow),reactions.type(LOVE).summary(1).as(love),reactions.type(HAHA).summary(1).as(haha),reactions.type(ANGRY).summary(1).as(angry)}},shares,type,link,actions,place,targeting,feed_targeting,scheduled_publish_time,backdated_time,description,likes.summary(true),reactions.type(SAD).summary(1).as(sad),reactions.type(WOW).summary(1).as(wow),reactions.type(LOVE).summary(1).as(love),reactions.type(HAHA).summary(1).as(haha),reactions.type(ANGRY).summary(1).as(angry)' 345 | 346 | fb = FacebookScraper(token_input) 347 | 348 | print("Get request parameters--",field_input) 349 | 350 | offset = 0 351 | json_list = [] 352 | while True: 353 | path = str(offset) + "_" + json_path_input 354 | #print("path--",path) 355 | try: 356 | data = fb.get_feed_data(target_page_input, str(offset), field_input, path, date_since_input) 357 | check = data['data'] 358 | if (len(check) >= 100): 359 | json_list.append(data) 360 | offset += 100 361 | print("Offset--",offset) 362 | else: 363 | json_list.append(data) 364 | print("End of loop for obtaining more than 100 feed records.") 365 | break 366 | except KeyError: 367 | print("Error with get request.") 368 | quit() 369 | 370 | print("Create feed table") 371 | feed_table_list = fb.extract_feed_data(json_list) 372 | print(feed_table_list[0]) 373 | fb.create_table_header(feed_table_list, csv_feed_path_input, target_page_input, "feed") 374 | print("Feed generated") 375 | 376 | print("Create Comment table") 377 | comments_table_list = fb.extract_comments_data(json_list) 378 | print(comments_table_list[0]) 379 | fb.create_table_header(comments_table_list, csv_comments_path_input, target_page_input, "comments") 380 | print("comments_table_list generated") 381 | 382 | print("Create Comment replies table") 383 | comment_replies_list = fb.extract_comment_replies_data(json_list) 384 | print(comment_replies_list[0]) 385 | fb.create_table_header(comment_replies_list, csv_reply_comment_path_input, target_page_input, "comment_replies") 386 | print("comments_table_list generated") 387 | -------------------------------------------------------------------------------- /Readme: -------------------------------------------------------------------------------- 1 | The Facebook Data Scraper/Extraction Script 2 | 3 | The Facebook scraper script can be used to extract the publically available data from the Facebook pages like (techinsider, NASA,etc). The script is useful to collect the post level data like post message,total number of likes and other reactions, all the post comments and all the replies to the respective comments. 4 | The script uses Facebook graph API to extract the post level data using the 'get' request. The guide lines to use the Facebook Graph API are given in the 'Graph API Guidelines' file. We can pass the necessory parameters to 'get' request to extract the required post data using Graph API. The data extracted with 'get' request is in JSON format and then converted to tabular(row-columns) format in CSV file by parsing each post data in the JSON file. 5 | There are two versions of the script, first is to extract the publically available data from the Facebook pages and second version is to extract post data as well as the post insight data. 6 | The first version i.e.(Facebook_scraper.py) creates 3 CSV files with post level data, each post comments data and replies comment data which is replies to respective comments. 7 | 3 CSV files and attributes: 8 | 1. {pagename}_feed_YYYYMMDD.csv 9 | Data Attributes: ["page_name", "id", "type", "created_time", "message", "name", "description", "actions_name", "share_count", "comment_count", "like_count", "sad_count", "wow_count", "love_count", "haha_count", "angry_count"] 10 | 2. {pagename}_post_comments_YYYYMMDD.csv 11 | Data Attributes: ["page_name", "post_id", "created_time", "message", "reply_cmt_cnt", "comments_like_cnt", "comment_haha_cnt", "comment_sad_cnt", "comment_wow_cnt", "comment_love_cnt", "comment_angry_cnt", "message_id"] 12 | 3. {pagename}_reply_comments_YYYYMMDD.csv 13 | Data Attributes: ["page_name", "parent_comment_id", "parent_comment_message", "reply_comment_message", "comment_id", "created_time", "comment_like_cnt"] 14 | 15 | The second version of script can extract Facebook post insight data like total number views, total uniq visitors to post, number of people who engaged with the post and etc. To execute this script, one needs Admin level access to the Facebook page. The second version is creates same data files as first version in addion with below 4 fields to the '{pagename}_feed_YYYYMMDD.csv' file. 16 | Additional Data Attributes: ["lifetime_post_impressions", "lifetime_post_impressions_unique", "lifetime_post_consumptions", "lifetime_post_consumptions_unique"] 17 | 18 | Limitations: 19 | The script can only extract the publically accessible data from the Facebook pagess, and results may change based on the privacy settings of the Page as well as the privacy settings of the user who interact woith the page. 20 | 21 | Usage: 22 | The script can extract the all the available backdated data from the Facebook page by passing the required earlier date. It will exctract all the data from earlier date to current data and create file with current date in its name. Depending on the data available, few pages do not give much older data. 23 | 24 | -------------------------------------------------------------------------------- /fifaworldcup_feed_20180620.csv: -------------------------------------------------------------------------------- 1 | page_name,id,type,created_time,message,name,description,actions_name,share_count,comment_count,like_count,sad_count,wow_count,love_count,haha_count,angry_count 2 | "fifaworldcup","606721589343692_2285380601477774","video","2018-06-21T01:00:01+0000","Meet Australia’s Daniel Arzani, the youngest player at the 2018 FIFA World Cup 🇦🇺","Arzani: “We need to stick together","","https://www.facebook.com/fifaworldcup/videos/2285380601477774/","57","348","1209","0","7","60","4","46" 3 | "fifaworldcup","606721589343692_2284922528190248","video","2018-06-21T00:00:01+0000","“We need to understand we can take on any national team in the world”“Tenemos que entender que podemos pelear contra cualquier selección”Miguel Trauco Saavedra and Selección Peruana - FPF are ready to face Équipe de France de Football 🇵🇪💪","Trauco: It will be a great match","","https://www.facebook.com/fifaworldcup/videos/2284922528190248/","229","626","2889","7","24","554","38","48" 4 | "fifaworldcup","606721589343692_2285845358097965","video","2018-06-20T23:00:00+0000","Will AFA - Selección Argentina record their first win at Russia 2018? We spoke to Paulo Dybala ahead of their clash with Hrvatski nogometni savez.","Dybala: There will be more space","","https://www.facebook.com/fifaworldcup/videos/2285845358097965/","168","650","2733","6","23","232","53","88" 5 | "fifaworldcup","606721589343692_2286379418044559","photo","2018-06-20T22:30:00+0000","STAY TUNED: Équipe de France de Football vs Selección Peruana - FPF with Robert Pires! Join the Live Stream on Thursday 21 June, 16:30 CET at HisenseSports. Incredible prizes, incredible legend, incredible show! #seetheincredible","","","https://www.facebook.com/606721589343692/posts/2286379418044559/","16","530","1071","1","3","16","5","78" 6 | "fifaworldcup","606721589343692_2285183188164182","video","2018-06-20T22:00:00+0000","It’s their first FIFA World Cup since 1982 and Selección Peruana - FPF fans are bringing the noise 🙌How do you think Peru will do against France on Thursday? 🤔¡36 años…son muchos años! 🇵🇪🇵🇪🇵🇪Por eso, los fans de Perú estén haciendo mucho ruido en Rusia 📣","Peru fans enjoying the trip of a lifetime","","https://www.facebook.com/fifaworldcup/videos/2285183188164182/","563","808","3314","6","21","1189","167","39" 7 | "fifaworldcup","606721589343692_2286361171379717","video","2018-06-20T20:25:33+0000","Luis Suarez marked his 100th international cap by scoring the winning goal against Saudi Arabia and sending AUF - Selección Uruguaya de Fútbol into the last 16 of the FIFA World Cup. 🎥 Highlights 👉 https://www.youtube.com/fifa📺 TV listings 👉 http://fifa.tv/watch2018","Moment of the Day (20 June)","","https://www.facebook.com/fifaworldcup/videos/2286361171379717/","532","909","6359","10","38","317","76","135" 8 | "fifaworldcup","606721589343692_2286347128047788","photo","2018-06-20T20:18:07+0000","","","","https://www.facebook.com/606721589343692/posts/2286347128047788/","1899","4094","24067","67","218","4151","1963","114" 9 | "fifaworldcup","606721589343692_2286243091391525","photo","2018-06-20T20:01:04+0000","Group B looks like this after two matchdays 👀","","","https://www.facebook.com/606721589343692/posts/2286243091391525/","2648","2199","22415","1114","208","1123","111","331" 10 | "fifaworldcup","606721589343692_2286229454726222","photo","2018-06-20T19:58:36+0000","","","","https://www.facebook.com/606721589343692/posts/2286229454726222/","1035","955","8589","117","308","523","157","60" 11 | "fifaworldcup","606721589343692_2286205978061903","photo","2018-06-20T19:53:35+0000","Spain beat Iran thanks to Diego Costa goal","","","https://www.facebook.com/606721589343692/posts/2286205978061903/","7855","1809","41154","1788","267","3153","334","425" 12 | "fifaworldcup","606721589343692_2286056768076824","photo","2018-06-20T18:48:18+0000","Group B: 🇮🇷 IR Iran 0-1 Spain 🇪🇦 (20 June)","Photos from FIFA World Cup's post","","https://www.facebook.com/606721589343692/posts/2286056768076824/","1423","1421","16311","92","81","610","247","93" 13 | "fifaworldcup","606721589343692_2285955621420272","photo","2018-06-20T18:00:07+0000","Gerard Piqué joins Sergio Ramos, Andrés Iniesta, David Silva and Sergio Busquets as players in the squad of the 2018 FIFA World Cup to play 100 matches for Selección Española de Fútbol (SeFutbol) 🇪🇸💯","","","https://www.facebook.com/606721589343692/posts/2285955621420272/","377","848","8084","3","32","639","138","56" 14 | "fifaworldcup","606721589343692_2284862508196250","video","2018-06-20T17:45:00+0000","The instrumental song accompanying the flags & players coming out of the tunnel at the World Cup is a new and vibrant theme by composers Hans Zimmer & Lorne Balfe. There are other innovations in the infotainment programme to warm up fans before each kick-off. Take a look!","LIVING FOOTBALL","","https://www.facebook.com/fifaworldcup/videos/2284862508196250/","617","575","5874","9","98","514","21","47" 15 | "fifaworldcup","606721589343692_2285861144763053","photo","2018-06-20T17:16:07+0000","","FIFA World Football Museum","WORLD CUP HISTORY| In 1998, history was made at the World Cup as Iran and the USA put political adversity aside for a game of football 🇮🇷🇺🇸Here they are pictured arm in arm before the start of the game, a display which would earn each team the FIFA Fair Play award. In our collection we have both one of the medals awarded, and the shirt worn by the game's first goal scorer - Hamid Estili.","https://www.facebook.com/606721589343692/posts/2285861144763053/","130","600","3219","3","16","122","10","56" 16 | "fifaworldcup","606721589343692_2285824058100095","photo","2018-06-20T17:02:25+0000","Uruguay have booked their place in the knockout stage. Hosts Russia will join the South Americans while Egypt are eliminated along with Saudi Arabia with a game still to play.","","","https://www.facebook.com/606721589343692/posts/2285824058100095/","2103","690","14534","920","116","410","204","33" 17 | "fifaworldcup","606721589343692_2285807781435056","photo","2018-06-20T16:57:08+0000","","","","https://www.facebook.com/606721589343692/posts/2285807781435056/","698","410","6613","55","70","205","270","33" 18 | "fifaworldcup","606721589343692_2285789414770226","photo","2018-06-20T16:51:59+0000","Suarez fires Uruguay into Round of 16","","","https://www.facebook.com/606721589343692/posts/2285789414770226/","5719","759","34619","430","182","1693","283","143" 19 | "fifaworldcup","606721589343692_2285695188112982","photo","2018-06-20T16:14:51+0000","Luis Suarez is the first player to score a goal for AUF - Selección Uruguaya de Fútbol in three different FIFA World Cup editions 🇺🇾🙌","","","https://www.facebook.com/606721589343692/posts/2285695188112982/","1050","561","13013","11","124","728","74","39" 20 | "fifaworldcup","606721589343692_2285622044786963","photo","2018-06-20T15:47:15+0000","Group A: 🇺🇾 Uruguay 1-0 Saudi Arabia 🇸🇦 (20 June)","Photos from FIFA World Cup's post","","https://www.facebook.com/606721589343692/posts/2285622044786963/","898","520","10254","20","33","254","145","16" 21 | "fifaworldcup","606721589343692_2285548648127636","video","2018-06-20T15:21:37+0000","INTERVIEW | Cristiano Ronaldo scored his fourth goal of the 2018 FIFA World Cup to earn Seleções de Portugal a 1-0 victory over Morocco and to win the Budweiser #ManOfTheMatch award.","Budweiser Man Of The Match | Cristiano Ronaldo","","https://www.facebook.com/fifaworldcup/videos/2285548648127636/","3087","3043","30375","51","344","4050","380","2293" 22 | "fifaworldcup","606721589343692_2285521948130306","photo","2018-06-20T15:04:44+0000","Luis Suarez plays his 100th match for AUF - Selección Uruguaya de Fútbol to become the sixth player to achieve this milestone 🇺🇾💯","","","https://www.facebook.com/606721589343692/posts/2285521948130306/","702","392","11595","1","64","695","219","42" 23 | "fifaworldcup","606721589343692_2285412764807891","video","2018-06-20T14:45:00+0000","Last night, Сборная России по футболу took a step closer to the Round of 16. Check out the Russian fan reaction at the #FIFAFanFest! 🇷🇺🙌","FAN FEST FEVER!","","https://www.facebook.com/fifaworldcup/videos/2285412764807891/","338","188","4789","42","78","214","26","16" 24 | "fifaworldcup","606721589343692_2285338171482017","photo","2018-06-20T14:01:05+0000","","","","https://www.facebook.com/606721589343692/posts/2285338171482017/","3061","2853","28724","3598","314","1773","228","429" 25 | "fifaworldcup","606721589343692_2285303988152102","photo","2018-06-20T13:53:37+0000","Cristiano Ronaldo strike sees off Morocco","","","https://www.facebook.com/606721589343692/posts/2285303988152102/","19274","4194","129886","3832","837","14434","799","1348" 26 | "fifaworldcup","606721589343692_2285210388161462","photo","2018-06-20T13:04:50+0000","Cristiano Ronaldo is now Europe's all-time top international scorer 🔥","","","https://www.facebook.com/606721589343692/posts/2285210388161462/","13327","2061","98219","96","1876","13345","638","550" 27 | "fifaworldcup","606721589343692_2285166591499175","photo","2018-06-20T12:48:11+0000","Group B: 🇵🇹 Portugal 1-0 Morocco 🇲🇦 (20 June)","Photos from FIFA World Cup's post","","https://www.facebook.com/606721589343692/posts/2285166591499175/","2948","1771","36176","282","224","2487","148","1172" 28 | "fifaworldcup","606721589343692_2283107171705117","video","2018-06-20T12:00:02+0000","Nacho Fernández Iglesias thought he had to give up football as a child due to diabetes. Instead, he went on to score on his FIFA World Cup debut. 🇪🇸💪","Nacho: I feel very proud","","https://www.facebook.com/fifaworldcup/videos/2283107171705117/","272","125","5245","3","49","290","7","4" 29 | "fifaworldcup","606721589343692_2283114718371029","video","2018-06-20T11:00:01+0000","“We are here to write our success story” 💪IR Iran face a monumental task with Seleções de Portugal and Selección Española de Fútbol (SeFutbol) in their group. Can Omid Ebrahimi and his teammates progress to the Round of 16 at Russia 2018? 🤔","Ebrahimi: We will fight to the last minute","","https://www.facebook.com/fifaworldcup/videos/2283114718371029/","98","126","2826","1","9","80","28","2" 30 | "fifaworldcup","606721589343692_2284912434857924","photo","2018-06-20T10:04:36+0000","Are 🇮🇸Iceland no longer the underdog? We look at a potential shift in reputation after the country's remarkable recent results.Read 👉 https://fifa.to/e/9Ax3mbYQTN","","","https://www.facebook.com/606721589343692/posts/2284912434857924/","75","114","4485","1","12","165","43","7" 31 | "fifaworldcup","606721589343692_2284599491555885","photo","2018-06-20T10:00:01+0000","","","","https://www.facebook.com/606721589343692/posts/2284599491555885/","159","195","6581","2","21","246","35","2" 32 | "fifaworldcup","606721589343692_2283204071695427","video","2018-06-20T09:00:01+0000","After a heavy defeat against the hosts in the Opening Match, Saudi Arabia’s Taiseer Al Jassam is looking to bounce back.","Al Jassam: We still got a chance","","https://www.facebook.com/fifaworldcup/videos/2283204071695427/","112","132","3607","2","19","66","160","1" 33 | "fifaworldcup","606721589343692_2284587128223788","photo","2018-06-20T08:00:00+0000","","","","https://www.facebook.com/606721589343692/posts/2284587128223788/","156","252","8224","1","51","333","77","16" 34 | "fifaworldcup","606721589343692_2284643061551528","video","2018-06-20T07:30:00+0000","Take a picture with a rival fan. WIN a trip to the World Cup Final! #RivalHugT&Cs: https://fifa.to/IG8yg3DnAN","HUG A RIVAL!","","https://www.facebook.com/fifaworldcup/videos/2284643061551528/","245","107","3847","0","18","224","51","2" 35 | "fifaworldcup","606721589343692_2283223725026795","video","2018-06-20T07:00:02+0000","🇵🇹 v 🇲🇦🇺🇾 v 🇸🇦🇮🇷 v 🇪🇦So, who's ready for Matchday 7? 😊","MATCHDAY 7 PREVIEW","","https://www.facebook.com/fifaworldcup/videos/2283223725026795/","1561","480","10361","3","114","870","23","5" 36 | "fifaworldcup","606721589343692_2282562795092888","photo","2018-06-20T06:00:01+0000","Here is what is on today...Predictions?(All kick-offs displayed in LOCAL TIME)","","","https://www.facebook.com/606721589343692/posts/2282562795092888/","3385","1061","23827","7","232","964","52","5" 37 | "fifaworldcup","606721589343692_2282982685050899","video","2018-06-20T05:00:01+0000","Striker André Silva expects “another hard match” at Russia 2018. How do you think Seleções de Portugal will do against Morocco?","Silva: It will be a very difficult game","","https://www.facebook.com/fifaworldcup/videos/2282982685050899/","165","95","3004","0","15","138","12","2" 38 | "fifaworldcup","606721589343692_2282971645052003","video","2018-06-20T04:00:01+0000","🇲🇦🇲🇦🇲🇦Morocco’s Achraf Hakimi on preparing to face Real Madrid C.F. team-mate Cristiano Ronaldo.","Hakimi: We know Cristiano is the best player in the world","","https://www.facebook.com/fifaworldcup/videos/2282971645052003/","246","290","7536","5","51","383","166","5" 39 | -------------------------------------------------------------------------------- /fifaworldcup_reply_comments_20180620.csv: -------------------------------------------------------------------------------- 1 | page_name,parent_comment_id,parent_comment_message,reply_comment_message,comment_id,created_time,comment_like_cnt 2 | "fifaworldcup","2283204071695427_2284825598199941","Who is the best player Right now?🤔1. Like for #Ronaldo 👍 🇵🇹2. Wow for #LeMessi 😮🇦🇷3. Love for #Mo_Salah💝🇪🇬4. Haha for #Neymar😂🇧🇷","Not other than Ronaldo","2283204071695427_2285121721503662","2018-06-20T12:19:41+0000","0" 3 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","Except saudi","2283204071695427_2284926721523162","2018-06-20T10:14:07+0000","1" 4 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","If they score any goal it will be conciderd as win ok","2283204071695427_2284928461522988","2018-06-20T10:15:15+0000","0" 5 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","It won't be unless they win the match itself","2283204071695427_2284930948189406","2018-06-20T10:17:02+0000","1" 6 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","Just one goal is not a win, its a team not kids playing","2283204071695427_2284935314855636","2018-06-20T10:19:36+0000","1" 7 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","I hope i will be alive to wetness your national team at least qualifying to the Asian qualifiers final round","2283204071695427_2284975914851576","2018-06-20T10:48:46+0000","1" 8 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","Dont mind khalidWe support ur team n realy happy to ur team in this world cupbut if u lose u should score some alsoLast nite egypt played well but failed to scoreU cant stop them scoring but u have to score when u get a chance no need to play defencive","2283204071695427_2284995711516263","2018-06-20T11:01:23+0000","1" 9 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","N khalidThe football is made in pakistan","2283204071695427_2284997731516061","2018-06-20T11:02:36+0000","1" 10 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","Morroco 1-1 Portugal","2283204071695427_2285032731512561","2018-06-20T11:25:19+0000","1" 11 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","No reedRonaldo will must score","2283204071695427_2285034638179037","2018-06-20T11:26:35+0000","1" 12 | "fifaworldcup","2283204071695427_2284911328191368","Best of luck today forIranSaudiMoroco","Of course he will score that 1goal","2283204071695427_2285051871510647","2018-06-20T11:37:14+0000","0" 13 | "fifaworldcup","2283204071695427_2284806271535207","Bounce back to another defeat. Uruguay must win them.","Uruguay with who will play?","2283204071695427_2284810054868162","2018-06-20T09:08:14+0000","0" 14 | "fifaworldcup","2283204071695427_2284806271535207","Bounce back to another defeat. Uruguay must win them.","Saudi Arabia.","2283204071695427_2284852688197232","2018-06-20T09:31:25+0000","0" 15 | "fifaworldcup","2283204071695427_2284806271535207","Bounce back to another defeat. Uruguay must win them.","Saudi Arabia am sorry because u guys wont get any point 4m all ur matches wht a bad performance","2283204071695427_2285243854824782","2018-06-20T13:21:50+0000","0" 16 | "fifaworldcup","2283204071695427_2284819658200535","Check the confidence. ..lol get ready for 10-0 result","I think so too. Saudi players don't play in Europe, so they lack experience compare to Japan, Korea, Iran and Australia. KSA might be strong in Asia, but the world cup is much higher than Asia in level. No matter how much billion dollar KSA and China paid for great foreign coach and players, your team can never get strong. Japan is allied with Germany, and now sending a lot of promising young talents to German Bundesliga. And from Germany, Japanese players can play from all over Europe. Now 80% of Japanese players are belonging to European clubs, and we are no longer Asian team. Saudi players all look scared sheep to me...","2283204071695427_2284865958195905","2018-06-20T09:38:55+0000","2" 17 | "fifaworldcup","2283204071695427_2284819658200535","Check the confidence. ..lol get ready for 10-0 result","u r wrong. Saudi arabia will win inshallah","2283204071695427_2284883751527459","2018-06-20T09:49:52+0000","2" 18 | "fifaworldcup","2283204071695427_2284819658200535","Check the confidence. ..lol get ready for 10-0 result","If ur face not beautifull u can talk beautifully at least","2283204071695427_2284912901524544","2018-06-20T10:04:55+0000","0" 19 | "fifaworldcup","2283204071695427_2284819658200535","Check the confidence. ..lol get ready for 10-0 result","Yes u right","2283204071695427_2284922934856874","2018-06-20T10:11:25+0000","0" 20 | "fifaworldcup","2283204071695427_2284846911531143","My life these days : sleep --> eat --> watch fifa world cup match --> repeat","Same me😂","2283204071695427_2284905348191966","2018-06-20T10:00:20+0000","1" 21 | "fifaworldcup","2283204071695427_2284813148201186","After a heavy defeat against the host...now Saudi Arabia is ready for a premium first class flight home.","Dan, are you very fun😂","2283204071695427_2284817584867409","2018-06-20T09:13:04+0000","1" 22 | "fifaworldcup","2283204071695427_2284813148201186","After a heavy defeat against the host...now Saudi Arabia is ready for a premium first class flight home.","","2283204071695427_2284937884855379","2018-06-20T10:21:31+0000","0" 23 | "fifaworldcup","2283204071695427_2284798044869363","Who Will Win The World Cup?1. Like 👍🏻for #Brasil 🇧🇷2. Love ❤️for #Argentina 🇦🇷3. Haha 😂 for #Germany🇩🇪4. Wow 😯 for #Portugal🇵🇹5. Sad 😢 for #Spain🇪🇸6. Angry😠 for #Others","Dislike 😒 for #Italy","2283204071695427_2284801768202324","2018-06-20T09:03:15+0000","1" 24 | "fifaworldcup","2283204071695427_2284798044869363","Who Will Win The World Cup?1. Like 👍🏻for #Brasil 🇧🇷2. Love ❤️for #Argentina 🇦🇷3. Haha 😂 for #Germany🇩🇪4. Wow 😯 for #Portugal🇵🇹5. Sad 😢 for #Spain🇪🇸6. Angry😠 for #Others","And what happen with #Colombia?","2283204071695427_2284803621535472","2018-06-20T09:04:07+0000","1" 25 | "fifaworldcup","2283204071695427_2284798044869363","Who Will Win The World Cup?1. Like 👍🏻for #Brasil 🇧🇷2. Love ❤️for #Argentina 🇦🇷3. Haha 😂 for #Germany🇩🇪4. Wow 😯 for #Portugal🇵🇹5. Sad 😢 for #Spain🇪🇸6. Angry😠 for #Others","Mexico will win","2283204071695427_2284820084867159","2018-06-20T09:14:31+0000","0" 26 | "fifaworldcup","2283204071695427_2284798044869363","Who Will Win The World Cup?1. Like 👍🏻for #Brasil 🇧🇷2. Love ❤️for #Argentina 🇦🇷3. Haha 😂 for #Germany🇩🇪4. Wow 😯 for #Portugal🇵🇹5. Sad 😢 for #Spain🇪🇸6. Angry😠 for #Others","philipines 😭","2283204071695427_2285065301509304","2018-06-20T11:45:10+0000","0" 27 | "fifaworldcup","2283204071695427_2284862311529603","Viva 🇸🇦 , wish you all the best of luck. 🇺🇾 is hard competence but yet we Saudi Arabia 🇸🇦 can do it.","إن شاء الله","2283204071695427_2285038454845322","2018-06-20T11:29:10+0000","0" 28 | "fifaworldcup","2283204071695427_2284862311529603","Viva 🇸🇦 , wish you all the best of luck. 🇺🇾 is hard competence but yet we Saudi Arabia 🇸🇦 can do it.","تحية من تونس لشعب الجزيرة العربية و الله لا تربح آل سلول وحكامها الكلاب عملاء ترامب و إنشاء الله لن يستطيعوا دخول مكة المكرمة !!","2283204071695427_2285655294783638","2018-06-20T15:58:24+0000","0" 29 | "fifaworldcup","2283204071695427_2284817011534133","Theoretically, yes and ambition is required .. But based on the performance of our team in their first encounter against the russians, I guess it won't be an easy task. Uruguay players want to qualify and they are expected to do their best accomplish the task ..","And what's your team?","2283204071695427_2284831261532708","2018-06-20T09:21:13+0000","0" 30 | "fifaworldcup","2283204071695427_2284817011534133","Theoretically, yes and ambition is required .. But based on the performance of our team in their first encounter against the russians, I guess it won't be an easy task. Uruguay players want to qualify and they are expected to do their best accomplish the task ..","Saudi Arabian team. This is what I said, they showed poor performance against the russians. Chances (based on the performance) are very slim to qualify although theoretically (based on remaining matches) there is a chance. We are meeting a high caliper (Uruguay) and it is odds won't be in our favour of course ..","2283204071695427_2284838321532002","2018-06-20T09:25:29+0000","0" 31 | "fifaworldcup","2284587128223788_2284742261541608","Happy birthday and good luck for today's match ❤","Can you speak English?","2284587128223788_2284773194871848","2018-06-20T08:44:59+0000","0" 32 | "fifaworldcup","2284587128223788_2284742261541608","Happy birthday and good luck for today's match ❤","It's spain!! You can't win LOL","2284587128223788_2284792181536616","2018-06-20T08:57:54+0000","0" 33 | "fifaworldcup","2284587128223788_2284742261541608","Happy birthday and good luck for today's match ❤","Mostafa Alaa can you??😂😂😂","2284587128223788_2284808758201625","2018-06-20T09:07:24+0000","0" 34 | "fifaworldcup","2284587128223788_2284742261541608","Happy birthday and good luck for today's match ❤","Its from","2284587128223788_2284853934863774","2018-06-20T09:32:27+0000","0" 35 | "fifaworldcup","2284587128223788_2284742261541608","Happy birthday and good luck for today's match ❤","Mostafa Alaa whatever mr “mostarah”!! Lol, look it up! Nice name lol","2284587128223788_2285550004794167","2018-06-20T15:17:32+0000","0" 36 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","That isn’t the English flag.","2284587128223788_2284728954876272","2018-06-20T08:16:56+0000","0" 37 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","What is the animation for morocco ? And for Japan ?","2284587128223788_2284731368209364","2018-06-20T08:18:34+0000","0" 38 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","Grant Thomson that only is showing in FB emojis","2284587128223788_2284736214875546","2018-06-20T08:22:07+0000","0" 39 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","Go Faroe Islands!","2284587128223788_2284773141538520","2018-06-20T08:44:57+0000","0" 40 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","Lilia Ha がんばれ日本allez maghreb / dima maghreb","2284587128223788_2284774881538346","2018-06-20T08:46:16+0000","0" 41 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","Please stop that.","2284587128223788_2284783044870863","2018-06-20T08:51:59+0000","0" 42 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","","2284587128223788_2284788821536952","2018-06-20T08:55:56+0000","0" 43 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","","2284587128223788_2284788978203603","2018-06-20T08:56:03+0000","0" 44 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","","2284587128223788_2284789228203578","2018-06-20T08:56:10+0000","0" 45 | "fifaworldcup","2284587128223788_2284725911543243","Touch your team color 👇 below to get the vibe. It really works 😲 Vamos Argentina 🇦🇷Come on Belgium 🇧🇪Come on england 🇫🇴Vai Brasil 🇧🇷Forca Portugal 🇵🇹auf geht's deutschland 🇩🇪Allez les bleus 🇫🇷Vamos espanavamos méxicoGooaal ⚽️⚽️","","2284587128223788_2284789454870222","2018-06-20T08:56:17+0000","0" 46 | "fifaworldcup","2284643061551528_2284666958215805","Who will win the FIFA WORLD CUP?⚽1. Like 👍 for #Argentina 🇦🇷2. Love ❤️ for #Brazil 🇧🇷3. Haha 😆 for #Portugal 🇵🇹 4. Wow 😮 for #Germany 🇩🇪5. Sad 😢 for #Spain 🇪🇸6. Angry 😡 for #Others 🎌","answer yurself bcoz the haven't yet rich quarter/semi..","2284643061551528_2284740228208478","2018-06-20T08:25:02+0000","0" 47 | "fifaworldcup","2284643061551528_2284682068214294","Argentina gohome","Brazil, Portugal gohome. Argentina champion!","2284643061551528_2284797584869409","2018-06-20T09:01:02+0000","4" 48 | "fifaworldcup","2284643061551528_2284682068214294","Argentina gohome","really","2284643061551528_2284914561524378","2018-06-20T10:06:14+0000","0" 49 | "fifaworldcup","2284643061551528_2284666881549146","I like seeing the peace. I guess the rumors are true that Russia is running out of beer.","Yes... the fans have already drunk everything... 😂😂😂🍺","2284643061551528_2284692618213239","2018-06-20T07:54:16+0000","3" 50 | "fifaworldcup","2284643061551528_2285670151448819","The beautiful game of fútbol needs to bring people together and not apart. Respect","Yes","2284643061551528_2285700658112435","2018-06-20T16:17:02+0000","0" 51 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","صعبه يا جلال مع احترمي ليك 😔😔","2283223725026795_2284626754886492","2018-06-20T07:01:31+0000","2" 52 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","انشاء الله منتخبنا يلعب كرة اوربية كل شيء ممكن","2283223725026795_2284628888219612","2018-06-20T07:02:59+0000","2" 53 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","ههههههه","2283223725026795_2284631221552712","2018-06-20T07:05:03+0000","1" 54 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","ان شاء الله يسير خير مع اني بشجع رونالدو مع مدريد","2283223725026795_2284632981552536","2018-06-20T07:06:29+0000","1" 55 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","جلال الدين علشان بلدك في كاس العالم فلازم تشجعها بس هبيقي موافق صعب عليك شويه لان انت بتحب الدون وفِي نفس الوقت مش عايز بلدك تخسر 😊😊😊","2283223725026795_2284635094885658","2018-06-20T07:08:11+0000","0" 56 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","البارح كنت بشجع مصر والحي كله كاننا في مصر","2283223725026795_2284635508218950","2018-06-20T07:08:29+0000","1" 57 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","جلال الدين لا لا أنا أسف أنا الي اتسراعت 😞","2283223725026795_2284636191552215","2018-06-20T07:09:01+0000","0" 58 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","نشجع جميع العرب الى ال سعود","2283223725026795_2284636718218829","2018-06-20T07:09:26+0000","0" 59 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","مافي مشكلة اخي العزيز مصر على راسنا","2283223725026795_2284638568218644","2018-06-20T07:10:35+0000","0" 60 | "fifaworldcup","2283223725026795_2284625818219919","Morocco 3..0 portugal","جلال الدين انشاء الله خير بس انتو منتخب مش سهل قوي بيتقدمو كوره حلو 😊😊😊وناس في مصر و كل العرب ان منتخب المغرب عندنا قدرات و لاعيبة مشاء الله في قمة الإبداع","2283223725026795_2284641588218342","2018-06-20T07:13:01+0000","0" 61 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","U feeling alryt brah","2282562795092888_2284549791560855","2018-06-20T06:02:01+0000","5" 62 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","lol What?","2282562795092888_2284550308227470","2018-06-20T06:02:28+0000","0" 63 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","He is totally out of control.....lol","2282562795092888_2284552628227238","2018-06-20T06:04:12+0000","1" 64 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","This guy since big teams played draws and 1 lost during first round so you think that will happen again remember its do or die now nations are doing their best","2282562795092888_2284552994893868","2018-06-20T06:04:32+0000","1" 65 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","Wake up lad, this isn't FIFA 18 lol","2282562795092888_2284553284893839","2018-06-20T06:04:47+0000","11" 66 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","You are in weed","2282562795092888_2284555378226963","2018-06-20T06:06:34+0000","0" 67 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","He might be in drunk","2282562795092888_2284555874893580","2018-06-20T06:06:50+0000","0" 68 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","😂😂😂😃","2282562795092888_2284556114893556","2018-06-20T06:06:57+0000","0" 69 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","Malinda Udara they can't afford weed","2282562795092888_2284556638226837","2018-06-20T06:07:20+0000","1" 70 | "fifaworldcup","2282562795092888_2284548691560965","Portugal 0:2 MoroccoUruguay 0:1 Saudi ArabiaIran 2:1 Spain","Next season : Man City0-4 Man Utd. Like","2282562795092888_2284556821560152","2018-06-20T06:07:30+0000","2" 71 | "fifaworldcup","2282982685050899_2284886444860523","A que horas son los partidos? Hora colombiana","Gracias por contactarnos. La lista completa de partidos está disponible en el siguiente enlace. Esperamos haber sido de ayuda. https://www.fifa.com/worldcup/match","2282982685050899_2285000268182474","2018-06-20T11:04:18+0000","0" 72 | "fifaworldcup","2282982685050899_2284521221563712","Ronaldo will become the first player in fifa world cup to score a hat trick back-to-back👌","Of course Another htrick","2282982685050899_2284738884875279","2018-06-20T08:24:01+0000","0" 73 | "fifaworldcup","2282982685050899_2284521221563712","Ronaldo will become the first player in fifa world cup to score a hat trick back-to-back👌","And Morocco will be the first team in fifa world cup to score three hat tricks per three players during one match","2282982685050899_2284771981538636","2018-06-20T08:44:03+0000","1" 74 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","who is messi???","2282971645052003_2284991934849974","2018-06-20T10:59:00+0000","2" 75 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","Messi who ??? Never heard of him ??","2282971645052003_2284997834849384","2018-06-20T11:02:41+0000","3" 76 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","Izabella Ricci me too , i know cristiano penaldo","2282971645052003_2285000254849142","2018-06-20T11:04:17+0000","0" 77 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","And messi can’t even score penalties","2282971645052003_2285003578182143","2018-06-20T11:06:24+0000","7" 78 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","ronaldo only 1 foul has scored this year and that 4 days ago","2282971645052003_2285007378181763","2018-06-20T11:08:54+0000","0" 79 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","Marco Praça the one who misses penalties....","2282971645052003_2285011901514644","2018-06-20T11:11:57+0000","0" 80 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","I believe this cup is between Russia, Portugal, or Spain ... No one else !!!","2282971645052003_2285244741491360","2018-06-20T13:22:19+0000","0" 81 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","Μιχάλης Εφραιμίδης κτύπα λίγο το κεφάλι σου στον τοίχο..κ θα δεις και τα υπόλοιπα","2282971645052003_2285271328155368","2018-06-20T13:38:04+0000","0" 82 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","Maria T Vassiliou Τράβα πλυνε κανα πιατο , θα με κραζεις αντε","2282971645052003_2285272894821878","2018-06-20T13:38:59+0000","0" 83 | "fifaworldcup","2282971645052003_2284949361520898","ΑΗΑΗΑΗΗΑΗ you said that cristiano is the best player in the world?? hahhaha nice joke , messi is your father","Γιώργος Σαφλαγιούρας άκου τι λένε , ειδικά αυτη η μαρια . Ολοι μεσα στο κολπο για τον πεναλντο","2282971645052003_2285275161488318","2018-06-20T13:40:20+0000","0" 84 | --------------------------------------------------------------------------------