выборка нескольких URL с помощью Beautifulsoup - сбор метаданных в wp-плагинах - сортировка с отметкой времени - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь собрать немного информации с сайта: но он продолжает печатать «Нет», как будто заголовок или какой-либо тег, если я его заменяю, не существует.

The проект : для списка метаданных wordpress-плагинов: - около 50 плагинов представляют интерес! но проблема заключается в следующем: я хочу получить метаданные всех существующих плагинов. Затем я хочу отфильтровать после выборки - те плагины, которые имеют новейшую метку времени - которые обновляются (чаще всего) в последнее время. Все это очень важно ...

https://wordpress.org/plugins/wp-job-manager
https://wordpress.org/plugins/ninja-forms
https://wordpress.org/plugins/participants-database ....and so on and so forth.
 

enter image description here

у нас есть следующий набор метаданных для каждого плагина wordpress:

Version: 1.9.5.12 
installations: 10,000+    
WordPress Version: 5.0 or higher 
Tested up to: 5.4 PHP  
Version: 5.6 or higher    
Tags 3 Tags:databasemembersign-up formvolunteer
Last updated: 19 hours ago
enter code here

проект состоит из двух частей: looping -part: (что кажется довольно простым). часть парсера: где у меня есть некоторые проблемы - см. ниже. Я пытаюсь l oop через массив URL-адресов и вычистить данные ниже из списка WordPress-плагинов. Смотрите мой l oop ниже-

from bs4 import BeautifulSoup

import requests

#array of URLs to loop through, will be larger once I get the loop working correctly

plugins = ['https://wordpress.org/plugins/wp-job-manager', 'https://wordpress.org/plugins/ninja-forms']

это можно сделать так

ttt = page_soup.find("div", {"class":"plugin-meta"})
text_nodes = [node.text.strip() for node in ttt.ul.findChildren('li')[:-1:2]]

Вывод текстовых_узлов:

['Версия: 1.9.5.12', 'Активные установки: 10 000+', 'Проверено до: 5.6'] * ​​1036 *

но если мы хотим получить данные всех плагинов wordpress и затем отсортировать их, чтобы показать, скажем, последние 50 обновленных плагинов. Это было бы интересным заданием:

  • Прежде всего нам нужно получить URL-адреса

  • , затем мы получаем информацию и нужно разобраться в новейшей - самой новой отметке времени. Ie плагин, который обновлялся совсем недавно

  • Список 50 новейших элементов - это 50 плагинов, которые были обновлены недавно ...

Задача: как избежать перегрузки ОЗУ при загрузке всех URL-адресов. (см. здесь Как извлечь все URL-адреса на веб-сайте с помощью BeautifulSoup с интересными идеями, подходами и идеями.

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

a. how to fetch the meta-data of each plugin: 
b. and how to sort out the range of the newest updates… 
c. afterward how to pick out the 50 newest

1 Ответ

1 голос
/ 09 апреля 2020
import requests
from bs4 import BeautifulSoup
from concurrent.futures.thread import ThreadPoolExecutor

url = "https://wordpress.org/plugins/browse/popular/{}"


def main(url, num):
    with requests.Session() as req:
        print(f"Collecting Page# {num}")
        r = req.get(url.format(num))
        soup = BeautifulSoup(r.content, 'html.parser')
        link = [item.get("href")
                for item in soup.findAll("a", rel="bookmark")]
        return set(link)


with ThreadPoolExecutor(max_workers=20) as executor:
    futures = [executor.submit(main, url, num)
               for num in [""]+[f"page/{x}/" for x in range(2, 50)]]

allin = []
for future in futures:
    allin.extend(future.result())


def parser(url):
    with requests.Session() as req:
        print(f"Extracting {url}")
        r = req.get(url)
        soup = BeautifulSoup(r.content, 'html.parser')
        target = [item.get_text(strip=True, separator=" ") for item in soup.find(
            "h3", class_="screen-reader-text").find_next("ul").findAll("li")[:8]]
        head = [soup.find("h1", class_="plugin-title").text]
        new = [x for x in target if x.startswith(
            ("V", "Las", "Ac", "W", "T", "P"))]
        return head + new


with ThreadPoolExecutor(max_workers=50) as executor1:
    futures1 = [executor1.submit(parser, url) for url in allin]

for future in futures1:
    print(future.result())

Вывод: просмотр в режиме онлайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...