如何在CSV中抓取URL并存储数据?

shstlldc  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(123)

我有问题,从URL创建CSV文件,rog.asus.com/motherboards/rog-maximus/rog-maximus-xi-formula-model/spec/.我需要从页面规格下载有关主板,现在我只有头在Python中生成,但我不知道如何下载itemcontent.这是我得到了在CSV中创建头.

import requests
from bs4 import BeautifulSoup
import csv

# Wskazany link
url = "https://rog.asus.com/pl/motherboards/rog-maximus/rog-maximus-xi-formula-model/spec/"

# Pobierz zawartość strony
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# Znajdź wszystkie elementy <div> z odpowiednią klasą
spec_elements = soup.find_all('div', class_='ProductSpecSingle__productSpecItemRow__3sjMJ')

# Nagłówek do zapisania w pliku CSV
header = ['Procesor', 'Chipset', 'Pamięć', 'Grafika', 'Obsługa Multi-GPU',
          'Gniazda rozszerzeń', 'Magazyn danych', 'Sieć LAN', 'Bezprzewodowa sieć']

# Słownik do przechowywania danych specyfikacyjnych
data_dict = {key: '' for key in header}

# Dla każdego elementu <div>
for spec_element in spec_elements:
    # Znajdź element <h2> z odpowiednią klasą
    spec_title_element = spec_element.find('h2', class_='ProductSpecSingle__productSpecItemTitle__8gSrN')
    
    # Znajdź element <span> z odpowiednią klasą
    spec_value_element = spec_element.find('span', class_='ProductSpecSingle__descriptionItemValue__lVa0O')
    
    # Sprawdź, czy elementy zostały znalezione i czy zawierają tekst
    if spec_title_element and spec_value_element and spec_value_element.text.strip():
        # Pobierz tekst z elementów
        spec_title = spec_title_element.text.strip()
        spec_value = spec_value_element.text.strip()
        
        # Sprawdź, czy nagłówek jest w naszej liście nagłówków
        for header_name in header:
            if header_name.lower() in spec_title.lower():
                data_dict[header_name] = spec_value

# Nazwa pliku CSV
csv_filename = 'ASUS/specyfikacja_plyty_glownej.csv'

# Zapisz do pliku CSV z kodowaniem UTF-8
with open(csv_filename, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    
    # Zapisz nagłówek
    writer.writerow(header)
    
    # Zapisz dane
    writer.writerow([data_dict[header_name] for header_name in header])

print(f'Utworzono plik CSV: {csv_filename} z danymi specyfikacji.')

字符串
我需要使用Python生成CSV与技术规格的所有细节。

elcex8rz

elcex8rz1#

这里有两个主要问题-检查你的response/soup似乎网站正在阻止请求,所以添加一个用户代理:

response = requests.get(url, headers={'user-agent':'some-agent'})

字符串
其次,javascript动态呈现内容,requests不支持这一点-因此有两个选项:
1.您知道产品的内部ID,请使用API请求其他信息。
1.提取页脚的脚本部分中的信息,并通过json.loads()进行转换,然后像dict一样进行交互以选择jour信息:

data = json.loads(json.loads(re.search(r'JSON.parse.*("{.*?}")', response.text).group(1)))

示例

import requests, csv, re, json

# Wskazany link
url = "https://rog.asus.com/pl/motherboards/rog-maximus/rog-maximus-xi-formula-model/spec/"

response = requests.get(url, headers={'user-agent':'some-agent'})

data = json.loads(json.loads(re.search(r'JSON.parse.*("{.*?}")', response.text).group(1)))

specs = {e.get('Display_field'):' '.join([d.get('Display_description') for d in e.get('Description')]) for e in data.get('Spec').get('spec')[0].get('Spec_content')}

with open('zzz_my_result.csv', 'w', newline='') as f:
    w = csv.writer(f)
    w.writerow(specs.keys())
    w.writerow(specs.values())

相关问题