От создания веб-страниц до динамических таблиц с помощью Python

#python #pandas #facebook

#python #pandas #Facebook

Вопрос:

Это мой первый код, поскольку я делаю проект для колледжа. Я пытаюсь выяснить, как искать на страницах Facebook конкретную информацию обо всех библиотеках в моем штате во время пандемии этого года. Я стремлюсь исследовать поведение этих страниц, извлекая:

Название библиотеки идентификатор публикации публикация изображение видео время ссылка лайки комментарии

Здесь я хотел бы сделать две вещи:

Извлечение даты Создайте таблицу категорий внутри извлеченной информации без необходимости сохранять ее в CSV в Excel.

Проблема

При сохранении в CSV я продолжаю получать ошибку тайм-аута. При запуске без кода сохранения в csv он работает нормально.

Это ошибка, которую я получаю при сохранении в нем в CSV


 gaierror                                  Traceback (most recent call last)
~AppDataLocalProgramsPythonPython39libsite-packagesurllib3connection.py in _new_conn(self)
    158         try:
--> 159             conn = connection.create_connection(
    160                 (self._dns_host, self.port), self.timeout, **extra_kw

~AppDataLocalProgramsPythonPython39libsite-packagesurllib3utilconnection.py in create_connection(address, timeout, source_address, socket_options)
     60 
---> 61     for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
     62         af, socktype, proto, canonname, sa = res

~AppDataLocalProgramsPythonPython39libsocket.py in getaddrinfo(host, port, family, type, proto, flags)
    952     addrlist = []
--> 953     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
    954         af, socktype, proto, canonname, sa = res

gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

NewConnectionError                        Traceback (most recent call last)
~AppDataLocalProgramsPythonPython39libsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    669             # Make the request on the httplib connection object.
--> 670             httplib_response = self._make_request(
    671                 conn,

~AppDataLocalProgramsPythonPython39libsite-packagesurllib3connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    380         try:
--> 381             self._validate_conn(conn)
    382         except (SocketTimeout, BaseSSLError) as e:

~AppDataLocalProgramsPythonPython39libsite-packagesurllib3connectionpool.py in _validate_conn(self, conn)
    977         if not getattr(conn, "sock", None):  # AppEngine might not have  `.sock`
--> 978             conn.connect()
    979 

~AppDataLocalProgramsPythonPython39libsite-packagesurllib3connection.py in connect(self)
    308         # Add certificate verification
--> 309         conn = self._new_conn()
    310         hostname = self.host

~AppDataLocalProgramsPythonPython39libsite-packagesurllib3connection.py in _new_conn(self)
    170         except SocketError as e:
--> 171             raise NewConnectionError(
    172                 self, "Failed to establish a new connection: %s" % e

NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x00000209EBB45C10>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

MaxRetryError                             Traceback (most recent call last)
~AppDataLocalProgramsPythonPython39libsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    438             if not chunked:
--> 439                 resp = conn.urlopen(
    440                     method=request.method,

~AppDataLocalProgramsPythonPython39libsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    725 
--> 726             retries = retries.increment(
    727                 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]

~AppDataLocalProgramsPythonPython39libsite-packagesurllib3utilretry.py in increment(self, method, url, response, error, _pool, _stacktrace)
    445         if new_retry.is_exhausted():
--> 446             raise MaxRetryError(_pool, url, error or ResponseError(cause))
    447 

MaxRetryError: HTTPSConnectionPool(host='m.facebook.com', port=443): Max retries exceeded with url: /page_content_list_view/more/?page_id=705959662852579amp;start_cursor={"timeline_cursor%22:"AQHR3T-djz3rSrAJEo0g6i_h4IV3wSe3889MJeW2HfvpwnoRtouUloPvUdjPznXSh2B_jgmq9dLTrMJjKSlJ33uT4UsdE0hEoO9Clrawerg7iJC6Y6dbykg9uDvewPhm-TCs%22,"timeline_section_cursor%22:null,"has_next_page%22:true}amp;num_to_fetch=4amp;surface_type=posts_tab (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000209EBB45C10>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))

During handling of the above exception, another exception occurred:

ConnectionError                           Traceback (most recent call last)
<ipython-input-3-e17e43b93409> in <module>
     88 for biblioteca in listaBibliotecas:
     89   print("Biblioteca: "   biblioteca)
---> 90   for post in get_posts(biblioteca, pages=700):
     91     post['title'] = biblioteca
     92     print(post['title'])

~AppDataLocalProgramsPythonPython39libsite-packagesfacebook_scraperfacebook_scraper.py in _generic_get_posts(self, extract_post_fn, iter_pages_fn, page_limit, options)
     93 
     94         logger.debug("Starting to iterate pages")
---> 95         for i, page in zip(counter, iter_pages_fn()):
     96             logger.debug("Extracting posts from page %s", i)
     97             for post_element in page:

~AppDataLocalProgramsPythonPython39libsite-packagesfacebook_scraperpage_iterators.py in generic_iter_pages(start_url, page_parser_cls, request_fn)
     28     while next_url:
     29         logger.debug("Requesting page from: %s", next_url)
---> 30         response = request_fn(next_url)
     31 
     32         logger.debug("Parsing page response")

~AppDataLocalProgramsPythonPython39libsite-packagesfacebook_scraperfacebook_scraper.py in get(self, url, **kwargs)
     55     def get(self, url, **kwargs):
     56         try:
---> 57             response = self.session.get(url=url, **self.requests_kwargs, **kwargs)
     58             response.raise_for_status()
     59             return response

~AppDataLocalProgramsPythonPython39libsite-packagesrequestssessions.py in get(self, url, **kwargs)
    541 
    542         kwargs.setdefault('allow_redirects', True)
--> 543         return self.request('GET', url, **kwargs)
    544 
    545     def options(self, url, **kwargs):

~AppDataLocalProgramsPythonPython39libsite-packagesrequestssessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    528         }
    529         send_kwargs.update(settings)
--> 530         resp = self.send(prep, **send_kwargs)
    531 
    532         return resp

~AppDataLocalProgramsPythonPython39libsite-packagesrequestssessions.py in send(self, request, **kwargs)
    641 
    642         # Send the request
--> 643         r = adapter.send(request, **kwargs)
    644 
    645         # Total elapsed time of the request (approximately)

~AppDataLocalProgramsPythonPython39libsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    514                 raise SSLError(e, request=request)
    515 
--> 516             raise ConnectionError(e, request=request)
    517 
    518         except ClosedPoolError as e:

ConnectionError: HTTPSConnectionPool(host='m.facebook.com', port=443): Max retries exceeded with url: /page_content_list_view/more/?page_id=705959662852579amp;start_cursor={"timeline_cursor%22:"AQHR3T-djz3rSrAJEo0g6i_h4IV3wSe3889MJeW2HfvpwnoRtouUloPvUdjPznXSh2B_jgmq9dLTrMJjKSlJ33uT4UsdE0hEoO9Clrawerg7iJC6Y6dbykg9uDvewPhm-TCs%22,"timeline_section_cursor%22:null,"has_next_page%22:true}amp;num_to_fetch=4amp;surface_type=posts_tab (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000209EBB45C10>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
 

Желаемый результат

Таблица с извлеченной информацией.

Код

 import facebook_scraper
from facebook_scraper import get_posts

listaBibliotecas = ["bibliotecafoa", 
"Bibvet-UNESP-Biblioteca-Faculdade-de-Medicina-Veterinária-de-Araçatuba-126301131191734", 
"BibliotecaFCLAr", 
"BibliotecaInstitutodeQuimicaUnesp",
"biblioassisunesp",
"bibliotecaunespbauru",
"bboUNESP",
"bibliotecafcaunesp",
"bdrunesp",
"bibliotecaunespfranca",
"bibliotecaunespjaboticabal",
"bibliotecaunespmarilia",
"bibliotecaourinhos",
"bibliounespprudente",
"bre.unesp",
"biblioteca.rioclaro",
"Unesp.bro",
"Biblioteca.Ibilce.Unesp",
"biblio.ictunesp",
"Biblioteca-Unesp-Sorocaba-360009187409775",
"bibliotecaunesp.tupa",
"bibliotecabrasilianamindlinusp",
"BibliotecaCQUSP",
"Biblioteca-EACH-USP-Leste-308809459193048",
"ecabiblioteca",
"bibeefe",
"bibliotecaeescusp",
"DVBIBL.Poli",
"bibliotecaesalq",
"bibfauusp",
"Biblioteca-da-FDUSP-553522528001156",
"bibliotecafeusp",
"bibliotecafeausp",
"bibliotecaflorestanfernandes",
"bibliotecafmusp",
"DBDFMUSP",
"bibliotecafmvzusp",
"sdousp",
"bibfsp",
"bibliotecafzea",
"Biblioteca-do-IAU-USP-1887490454816888",
"BibliotecaIBUSP",
"BibliotecaICMC",
"Biblioteca.iee",
"bibliotecadafisica",
"bibliotecaifsc",
"BibliotecaInstitutoDeGeocienciasUsp",
"bibliotecairiusp",
"bibliotecairiusp",
"bibliotecairiusp",
"boraunicamp",
"BibliotecaCentralCesarLattes",
"biblioteca.bae",
"biblioteca.cotuca",
"bibliotecaFtUnicamp",
"fcabiblioteca",
"BibliotecaFCMUnicamp",
"BibliotecaFEF",
"bibliotecadafea",
"bibliotecafopunicamp",
"bibliotecaFtUnicamp",
"bibliotecadoia",
"Biblioteca-do-Instituto-de-Biologia-da-Unicamp-1130014760360973",
"BibEcoUnicamp",
"bibliotecaiel",
"BibliotecaIFCH",
"biblioteca.ige",
"IMECCUnicampBR",
"bibliotecaIQ",
"cedulabeurb",
"bibliotecapagu",
"BCoUFSCar",
"Biblioteca-Campus-Araras-UFSCar-275299496221531",
"bso.ufscar",
"BibliotecaLagoadoSino",
"biblioteca.bs",
"BibliotecaEPPEN",
"Biblioteca-EFLCH-Unifesp-Guarulhos-104713047826227",
"Biblioteca-ICT-Unifesp-campus-São-José-dos-Campos-340105403073716",
"Biblioteca-ICAQF-Unifesp-Diadema-496670690459414",
"Biblioteca-Campus-São-Paulo-Unifesp-147132782023686",
"biblioteca.ufabc"]

for biblioteca in listaBibliotecas:
  print("Biblioteca: "   biblioteca) 
  for post in get_posts(biblioteca, pages=300):
    post['title'] = biblioteca
    print(post['title'])    
    print(post['post_id'])
    print(post['time'])
    print(post['text'])
    print(post['image'])
    print(post['video'])
    print(post['likes'])
    print(post['comments'])
    print(post['shares'])
    print(post['link'])

print("==========================================================================================")
 

Возможно ли это?

Если да, то каков наилучший способ получить ожидаемый результат?

Большое спасибо

Ответ №1:

Просто добавьте оператор try-Exception и посмотрите, является ли результат null или нет. Если вывод равен null, это может быть ошибка в том, как вы используете библиотеку:

 for biblioteca in listaBibliotecas:
  print("Biblioteca: "   biblioteca) 
  all_posts = []
  try:
    all_posts = get_posts(biblioteca, pages=300)
  except Exception:
    print(f"Error while requesting Biblioteca: {biblioteca}")
    print("Checking the next one..")
  for post in all_posts:
    post['title'] = biblioteca
    print(post['title'])    
    print(post['post_id'])
    print(post['time'])
    print(post['text'])
    print(post['image'])
    print(post['video'])
    print(post['likes'])
    print(post['comments'])
    print(post['shares'])
    print(post['link'])

print("==========================================================================================")
 

Комментарии:

1. Привет, Лейн, большое спасибо за это. Я изучаю физические библиотеки, чтобы вы поняли. Я попробовал ваше исправление, и, похоже, оно исправило ошибку при очистке данных, но я до сих пор не знаю, как преобразовать ее в таблицу.

2. При добавлении файла write csv в algaritm, если у меня длинный набор данных, я получаю эту ошибку ————————————————————————— Трассировка ошибки ОС (последний последний вызов) <ipython-input-2-668f17161d98> в <модуле> 111 соткрыть («2811fbcode.csv», «a», новая строка =»», кодировка =»utf-8″) как f: 112 writer = csv.writer(f) —> 113 writer.writerow(данные) 114 115 распечатать(«================================================================================») Ошибка: [Ошибка 22] Недопустимый аргумент