pandas 使用python遍历html标记进入web抓取

inkz8wg9  于 2023-08-01  发布在  Python
关注(0)|答案(2)|浏览(108)

编写了一个Python脚本来抓取这个网站https://lumiwallet.com/assets/的所有资产列表。我已经设法得到第一个硬币的名称“比特币”,但没有股票代码。网站上有27页,每页有40个资产,我的意图是我想刮名字和股票所有27页上的所有资产,然后把它变成Pandas数据框架,然后变成csv。文件中有一列用于名称和一列用于股票代码的文件。我认为解决方案是编写一个for循环,迭代通过名称标签,也希望获得资产报价,但只获得名称,但因为我是一个业余爱好者,我不确定将for循环放在哪里,这是解决方案,或者可能不是解决方案。我包含了我的输出图像。

的数据
'''

from urllib import response
from webbrowser import get
import requests
from bs4 import BeautifulSoup
import csv
from csv import writer
from csv import reader
from urllib.parse import urlparse
import pandas as pd
from urllib.parse import urlencode

API_KEY = '7bbcbb39-029f-4075-97bc-6b57b6e9e68b'

def get_scrapeops_url(url):
    payload = {'api_key': API_KEY, 'url': url}
    proxy_url = 'https://proxy.scrapeops.io/v1/?' + urlencode(payload)
    return proxy_url

r = requests.get(get_scrapeops_url('https://lumiwallet.com/assets/'))
response = r.text

#list to store scraped data
data = []

soup = BeautifulSoup(response,'html.parser')
result = soup.find('div',class_ = 'assets-list__items')


# parse through the website's html
name = soup.find('div',class_ = 'asset-item__name')
ticker = soup.find('div',class__ = 'asset-item__short-name')

#Store data in a dictionary using key value pairs
d = {'name':name.text if name else None,'ticker':ticker.text if ticker else None} 

data.append(d)

#convert to a pandas df
data_df = pd.DataFrame(data)

data_df.to_csv("coins_scrape_lumi.csv", index=False)

print(data_df)

字符串
'''

rseugnpd

rseugnpd1#

为什么你使用“proxy_scapes”,如果你可以解析原生URL?你得到了HTML。
在代码中添加第二个'_',用于获取股票代码

result = soup.find('div',class__ = 'assets-list__items')

字符串
对于获取所有任务,您可以使用find all和cycle

from urllib import response
from webbrowser import get
import requests
from bs4 import BeautifulSoup
import csv
from csv import writer
from csv import reader
from urllib.parse import urlparse
import pandas as pd
from urllib.parse import urlencode

API_KEY = '7bbcbb39-029f-4075-97bc-6b57b6e9e68b'

def get_scrapeops_url(url):
    payload = {'api_key': API_KEY, 'url': url}
    proxy_url = 'https://proxy.scrapeops.io/v1/?' + urlencode(payload)
    return proxy_url

print(get_scrapeops_url('https://lumiwallet.com/assets/'))
r = requests.get(get_scrapeops_url('https://lumiwallet.com/assets/'))
response = r.text

#list to store scraped data
data = []

soup = BeautifulSoup(response,'html.parser')
result = soup.find('div',class_ = 'assets-list__items')


# parse through the website's html
name = soup.find_all('div',class_ = 'asset-item__name')
ticker = soup.find_all('div',class_ = 'asset-item__short-name')

#Store data in a dictionary using key value pairs
for i in range(len(name)):

  d = {'name':name[i].text if name[i] else None,'ticker':ticker[i].text if ticker[i] else None} 

  data.append(d)
print(data)

#convert to a pandas df
data_df = pd.DataFrame(data)

data_df.to_csv("coins_scrape_lumi.csv", index=False)

print(data_df)


对于获取其他页面,你可以模拟点击,bs4没有这个功能,你需要selenium或者tkinter。或其他图书馆。

bxgwgixi

bxgwgixi2#

因为这个网站上的每个页面都包含在同一个URL中,所以我们不能直接通过名称获取每个页面,所以我选择使用Selenium浏览器自动化来处理页面点击。这个脚本将带你到网页,抓取第一页,然后循环通过一系列的点击和抓取26次。共抓取27页,并点击26次进入下一页。将文本内容列表连接起来,然后使用字符串拆分来分隔列表名称和股票代码,它们由换行符“\n”分隔。最后,这些文件被转换为pandas dataframe,并以“写”模式导出为CSV,因此每当脚本执行时,它将覆盖该文件的先前副本。
在它按预期工作之前,您需要做的唯一一件事是确保您安装并更新了selenium,沿着与您的Google Chrome浏览器版本匹配的chromedriver版本。然后,你需要替换这一行中的文本,因为我的chromedriver路径对你不起作用:driver = webdriver.Chrome(r"YOUR CHROMEDRIVER PATH HERE", options=options)并将webdriver指向机器上chromedriver的位置。

import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://lumiwallet.com/assets/'

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')

driver = webdriver.Chrome(r"YOUR CHROMEDRIVER PATH HERE", options=options)
driver.get(url)
driver.implicitly_wait(3)

def get_assets():
    assets = []
    driver.implicitly_wait(3)
    asset_list = driver.find_element(By.CLASS_NAME, "assets-list__items")
    page_assets = asset_list.find_elements(By.CLASS_NAME, "asset-item")

    for asset in page_assets:
        assets.append(asset.text)
    
    return assets

def click_next_page():
    next_page = driver.find_element(By.CSS_SELECTOR, "#__layout > section > div.app-container > div > div > div.assets__body > div.assets-list > div.assets-list__pagination > div > div:nth-child(3) > div.pagination__item.pagination__item--next")
    driver.implicitly_wait(3)
    driver.execute_script("arguments[0].click();", next_page)
    driver.implicitly_wait(3)

assets = get_assets()

for i in range(26):
    click_next_page()
    assets += get_assets()

listings = []
tickers = []

for asset in assets:
    new = asset.split("\n")
    listings.append(new[0])
    tickers.append(new[1])
    
df = pd.DataFrame(list(zip(listings, tickers)),
                  columns = ['Listing', 'Ticker'])

df.to_csv('lumiwallet_listings.csv', mode='w', index=False)

字符串
如果你对此有任何疑问请告诉我。干杯!

相关问题