List добавить в базу данных для сохранения в excel
Парсил ресурс. Появился вопрос. Как добавить список(cards) в моем случае в базу данных, для сохранения в excel. Код то рабочий. Но вот мой список cards приходиться копировать из консоли и потом ручками добавлять в бд. Прописывать, etc. Не true. Надо чтобы автоматом подхватывал мой cards лист и вставлял в pd.DataFrame(cards).transpose(). И вообще, как оптимизировать мой код. Один раз такое вылезло - резы из паралльельных кодов, какие то левые данные оказались в консоли. И потом total резалт в excel не так настроен - вместо столбцов - строки.
import requests
from bs4 import BeautifulSoup
import csv
import os
import xlsxwriter
import pandas as pd
URL = 'https://wordpress.org/plugins/'
HOST = 'https://wordpress.org'
HEADERS = {
'accept': '.....,
'user-agent': '......'
}
def get_html(url, params=''):
r = requests.get(url, headers=HEADERS, params=params)
return r.text
def get_content(html):
soup = BeautifulSoup(html, 'lxml')
popular = soup.find_all('section')[1] # обращаемся ко второму элементу списка
plugins = popular.find_all('article')
# return (str(plugins).ljust(5))
# cards = []
# print(items)
# 1,560
def refined(s):
r = s.split(' ')[0] # сплит по пробелу, забираем первый элемент
return r.replace(',', '')
# print(result)
cards = []
for plugin in plugins:
r = plugin.find('span', class_='rating-count').find('a').get_text()
cards.append({
'name': plugin.find('h3').text,
'url': plugin.find('h3').find('a').get('href'),
'rating': refined(r) # функци refined удаляет пробелы и запятые, применительно к функции r
# print(rating)
# 'link_product': HOST + item.find('div', class_='title').find('a').get('href')
# 'brand': item.find('div', class_='title').get_text(strip=True),
# 'card_img': HOST + item.find('div', class_='image').find('img').get('src')
})
return cards
# html = get_html(URL)
# print(get_content(html.text))
cards = [{'name': 'Classic Editor', 'url': 'https://wordpress.org/plugins/classic-editor/', 'rating': '903'}, {'name': 'Akismet Spam Protection', 'url': 'https://wordpress.org/plugins/akismet/', 'rating': '909'}, {'name': 'Jetpack – WP Security, Backup, Speed, & Growth', 'url': 'https://wordpress.org/plugins/jetpack/', 'rating': '1560'}, {'name': 'bbPress', 'url': 'https://wordpress.org/plugins/bbpress/', 'rating': '315'}]
print(type(cards))
df = pd.DataFrame(cards).transpose()
# df = pd.DataFrame(lst).transpose()
writer = pd.ExcelWriter('Wordpress.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
workbook = writer.book
worksheet = writer.sheets['Sheet1']
format1 = workbook.add_format({'num_format': '#,##0.00'})
format2 = workbook.add_format({'num_format': '0%'})
worksheet.set_column('B:B', 80, format1)
worksheet.set_column('C:C', 35, format1)
worksheet.conditional_format('B2:B8', {'type': '3_color_scale'})
writer.save()
def main():
url = 'https://wordpress.org/plugins'
print(get_content(get_html(url)))
if __name__ == '__main__':
main()
````
Ответы (1 шт):
Все решается просто. Убрать строчку с transpose - не разобрался, предварительно с документацией Pandas проблема swap strokes to colums. Переместить блок с df = pd.DataFrame выше. Прямо к циклу. Так или иначе все срастается. Вот другой парсер, все пашет:
import requests
from bs4 import BeautifulSoup
import os
import xlsxwriter
import pandas as pd
URL = 'https://mastermoz.com/entertainment/movies/{}/'
HEADERS = {
'accept': '...',
'user-agent': '...'
}
def get_html(url, params=''):
r = requests.get(url, headers=HEADERS, params=params)
return r.text
def get_content(html, df_transposed=None): #get_page_data
soup = BeautifulSoup(html, 'lxml')
items = soup.find_all('div', class_='card-img-overlay-bottom z-index-20')
cards = []
for item in items:
cards.append({
'name': item.find('h4', class_='text-white text-shadow').text,
'url': item.find('a', class_='title-link').get('href'),
})
# print(len(items))
df = pd.DataFrame(cards)
writer = pd.ExcelWriter('study1.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
workbook = writer.book
worksheet = writer.sheets['Sheet1']
format1 = workbook.add_format({'num_format': '#,##0.00'})
format2 = workbook.add_format({'num_format': '0%'})
worksheet.set_column('B:B', 80, format1)
worksheet.set_column('C:C', 35, format1)
worksheet.conditional_format('B2:B8', {'type': '3_color_scale'})
writer.save()
def main():
pattern = 'https://mastermoz.com/entertainment/movies/{}/'
for i in range(1, 5):
url = pattern.format(str(i))
# print(url)
get_content(get_html(url))
if __name__ == '__main__':
main()
````