Как очистить все значения AJAX таблицы поиска с PYTHON? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь очистить базу данных CPU в TechPowerUp.

Я нашел обновления таблицы с использованием AJAX и создал следующий код:

import requests
from bs4 import BeautifulSoup
import csv
import string

cpus = []

base = 'https://www.techpowerup.com/cpu-specs/?ajaxsrch='

letters = list(string.ascii_lowercase)

letters.extend(range(0, 10))

for i in letters:
    URL = base + str(i)

    page = requests.get(URL)

    soup = BeautifulSoup(page.content, 'html.parser')

    with open('cpu2.csv', mode='a') as cpu_csv:
        headers = ['name', 'family', 'socket', 'release']
        writer = csv.DictWriter(cpu_csv, fieldnames=headers, lineterminator='\n')

        for tr in soup.find_all('tr')[1:]:
            tds = tr.find_all('td')

            if tds[0].text.strip() not in cpus:

                writer.writerow({'name': tds[0].text.strip(), 'family': tds[1].text.strip(), 'socket': tds[4].text.strip(), 'release': tds[8].text.strip()})

                cpus.append(tds[0].text.strip())

            else:
                print("duplicate")

Этот код работает в том смысле, что он перебирает AZ, затем 0-9 и заполняет CSV-файл, игнорируя дубликаты, однако я получаю логическую ошибку, когда я только собираю ~ 600 результатов, где более 2000 записей.

Я полагаю, что это может быть связано с ограничением количества возвращаемых элементов для каждого AJAX Поиска запроса, поэтому не все записи обнаруживаются, существует ли другой подход для извлечения всех результатов?

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 марта 2020
import pandas as pd
import string


items = string.digits + string.ascii_lowercase


def main(url):
    data = []
    for item in items:
        print(f"{item}")
        df = pd.read_html(url.format(item))[0]
        df = df[["Name", "Codename", "Socket", "Released"]]
        data.append(df)
    data = pd.concat(data)
    data.drop_duplicates(subset='Name', keep="first",inplace=True)
    data.to_csv("data.csv", index=False)


main("https://www.techpowerup.com/cpu-specs/?ajaxsrch={}")

Всего выводится 596 на основе удаления дубликатов По столбцу Name.

Просмотр онлайн

Пример вывода:

enter image description here

0 голосов
/ 31 марта 2020

Самый простой способ получить данные таблицы с помощью pandas. Получить данные в DataFrame и импортировать в CSV.

Код :

import string
import pandas as pd

base = 'https://www.techpowerup.com/cpu-specs/?ajaxsrch='

letters = list(string.ascii_lowercase)

letters.extend(range(0, 10))
df=pd.DataFrame()
for i in letters:
    URL = base + str(i)
    df1=pd.read_html(URL)[0]
    df = df.append(df1, ignore_index=True)

print(df[['Name','Codename','Socket','Released']]) #This will give you 1739 records

#If you want to delete duplicates use this
df.drop_duplicates(subset='Name', keep='first', inplace=True)
print(df[['Name','Codename','Socket','Released']]) #This will give you 595 records
#Import into Csv file
df[['Name','Codename','Socket','Released']].to_csv("cpu_csv.csv",index=False)
...