Проблема с обходом ссылок на Python 3 bs4 и проблема со списком словарей

#python #python-3.x #beautifulsoup #web-crawler

#python #python-3.x #beautifulsoup #веб-сканер

Вопрос:

Прошло некоторое время, когда я не просматривал веб-страницы, и меня заблокировали на веб-сайте…

Если я проверю страницу с помощью chrome, я увижу все ссылки в исходном коде, но при использовании bs4 с python 3 суп не будет содержать никаких ссылок!

Поскольку я новичок в сканировании, я хотел бы, чтобы кто-нибудь объяснил мне, пожалуйста 🙂

Связано ли это с агентом? действительно ли невозможно обойти эту страницу?

 import requests
from bs4 import BeautifulSoup
import re

url="https://www.pointdevente.parionssport.fdj.fr/grilles/resultats"
request_headers={'User-Agent': "(Mozilla/5.0 (Windows; U; Windows NT 6.0;en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6" }


r = requests.get(url,headers=request_headers)
req_txt=r.text
if r.status_code==200:
    soup = BeautifulSoup(req_txt, u'html5lib')
    print(soup.prettify())
    links_pak=[url   u'/'   node.get(u'href') for node in soup.find_all(u'a')] #if node.get(u'href').endswith(ext)]
    print("links : ",links_pak)
else:
    print(r.status_code)
 

Редактировать: после некоторых исследований я обнаружил, что это связано с JS front code, поэтому я посмотрел на поведение сети и нашел несколько вызовов API, которые я смогу использовать для того, что мне нужно.

Итак, вот моя проблема со списком словарей, поэтому у меня есть код ниже :

 import requests
from bs4 import BeautifulSoup
import re

url="https://www.pointdevente.parionssport.fdj.fr/api/loto-foot/list"

r = requests.get(url)
req_txt=r.text
if r.status_code==200:
    print(r.json())
    list_all=r.json()

else:
    print(r.status_code)
 

Я просмотрел много документации и понимаю, как фильтровать dicts по значению ключа или посмотреть, есть ли значение в списке dicts, но я хотел бы проверить в моем списке dicts (например, list_all), есть ли кортеж key:value в dict, если это такизвлекайте данные только этого dict!

В моем примере, если вы запустите снипет кода, вы увидите, что в dicts есть ключ ‘SportID’, я хочу получать dicts только там, где ‘SportID: 100’ имеет значение true…Я немного запутался в понимании dict….

Спасибо за вашу помощь!

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

1. Возможно, вам следует обратить внимание на полнофункциональный веб-браузер с автоматизацией ( selenium-python ?), Потому что многие веб-сайты получают данные через запросы JavaScript (XMLHttpRequest), которые может быть сложно получить с помощью requests / curl / wget . В вашем случае посмотрите на url pointdevente.parionssport.fdj.fr/api/loto-foot /…

2. да, я узнал этот адрес api, я не знаю, буду ли я его использовать или будут только совпадения 🙂 Тем не менее, я не знаю, как выбрать полезные для меня словари: ((( Я отредактировал свой пост, чтобы объяснить более подробно.

Ответ №1:

Хорошо, после многих попыток с пониманием списка я узнал, как это сделать…

Итак, вот рабочий фрагмент кода :

 import requests
from bs4 import BeautifulSoup
import re

url="https://www.pointdevente.parionssport.fdj.fr/api/loto-foot/list"

r = requests.get(url)
req_txt=r.text
if r.status_code==200:
    list_all=r.json()
    list_foot=[d for d in list_all if d['sportId']==100] #Filters foot results only
    print(list_foot)

else:
    print(r.status_code)