Как мне получить данные с веб-сайта с помощью scrapy?

#python #scrapy

#python #scrapy

Вопрос:

Я хочу получить все адреса для всех whale btc с веб-сайта https://explorer.btc.com/btc/top-address но в результате получается пустой respones.xpath

Мой код неаккуратный

 response.xpath("/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/table/tbody/tr[1]/td[2]/div/a").extract()
 

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

1. Если вы хотите, чтобы люди помогали вам, пожалуйста, подумайте о принятии их ответов.

Ответ №1:

Данные создаются динамически. Вы можете получить их из API.

Узнайте, как использовать scrapy shell и devtools. Также ознакомьтесь с документами для ответа json.

В любом случае, что я сделал: я открыл страницу в браузере и заглянул на вкладку сеть в разделе xhr, затем скопировал URL-адрес и заголовки и воссоздал запрос.

 scrapy shell

In [1]: headers = {
   ...: "Accept": "*/*",
   ...: "Accept-Encoding": "gzip, deflate, br",
   ...: "Accept-Language": "en-US,en;q=0.5",
   ...: "Cache-Control": "no-cache",
   ...: "Connection": "keep-alive",
   ...: "DNT": "1",
   ...: "Host": "explorer.api.btc.com",
   ...: "Origin": "https://explorer.btc.com",
   ...: "Pragma": "no-cache",
   ...: "Referer": "https://explorer.btc.com/",
   ...: "Sec-Fetch-Dest": "empty",
   ...: "Sec-Fetch-Mode": "cors",
   ...: "Sec-Fetch-Site": "same-site",
   ...: "Sec-GPC": "1",
   ...: "TE": "trailers",
   ...: "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.372
   ...: 9.169 Safari/537.36"
   ...: }

In [2]: url = 'https://explorer.api.btc.com/stats/address/rich/top?app_a=S2Q4QUljMHEwNzNoMAI5XdXXMAgwqxia4P8VScnvddXEG5
   ...: EguXvUEXk4ccTCamp;app_b=Kd8AIc0q073h0amp;nonce=DJI22151IXIC7512amp;timestamp=1639207870amp;coins=btcamp;max_count=100amp;page=1amp;p
   ...: age_size=50amp;sign=HHpvZxiIsZ0yUbRk0ZZ 1sdEyeC3MHnlAXBFLQPtNm0='

In [3]: req = scrapy.Request(url=url, headers=headers)

In [4]: fetch(req)
[scrapy.core.engine] INFO: Spider opened
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://explorer.api.btc.com/stats/address/rich/top?app_a=S2Q4QUljMHEwNzNoMAI5XdXXMAgwqxia4P8VScnvddXEG5EguXvUEXk4ccTCamp;app_b=Kd8AIc0q073h0amp;nonce=DJI22151IXIC7512amp;timestamp=1639207870amp;coins=btcamp;max_count=100amp;page=1amp;page_size=50amp;sign=HHpvZxiIsZ0yUbRk0ZZ 1sdEyeC3MHnlAXBFLQPtNm0=> (referer: https://explorer.btc.com/)

In [5]: json_data = response.json()

In [6]: for data in json_data['data']['btc']['list']:
   ...:     print(data['address'])
   ...:
34xp4vRoCGJym3xR7yCVPFHoCNxv4Twseo
bc1qgdjqv0av3q56jvd82tkdjpy7gdp9ut8tlqmgrpmv24sq90ecnvqqjwvw97
1P5ZEDWTKTFGxQjZphgWPQUpe554WKDfHQ
37XuVSEpWW4trkfmvWzegTHQt7BdktSKUs
38UmuUqPCrFmQo4khkomQwZ4VbY2nZMJ67
1FeexV6bAHb8ybZjqQMjJrcCrHGW9sb6uF
3LYJfcfHPXYJreMsASk2jkn69LWEYKzexb
...
...
...
...
...