Создание скрипта в Python, который будет искать определенный URL на всех страницах сайта, используя BeautifulSoup, запросы и, возможно, Scrapy. - PullRequest
0 голосов
/ 18 октября 2018

Я новый участник Stack Overflow, поэтому, пожалуйста, дайте мне знать, если и как я могу улучшить этот вопрос.Я работаю над сценарием Python, который берет ссылку на домашнюю страницу веб-сайта, а затем выполняет поиск определенного URL-адреса по всему веб-сайту (а не только на этой первой домашней странице).Причина этого заключается в том, что моя исследовательская группа хотела бы запросить список веб-сайтов для URL-адреса конкретной базы данных, не просматривая каждую страницу, чтобы найти ее.По сути, это задача сказать: «Этот сайт ссылается на эту базу данных? Если да, то сколько раз?»а затем сохранить эту информацию для наших записей.До сих пор я мог использовать ресурсы на SO и других страницах для создания сценария, который будет очищать HTML-код конкретной веб-страницы, на которую я ссылался, и я включил этот сценарий для проверки.

import requests  
from bs4 import BeautifulSoup  

url = raw_input("Enter the name of the website you'd like me to check, followed by a space:")

r = requests.get(url)

soup = BeautifulSoup(r.content, features='lxml')

links = soup.find_all("a")
for link in links:
    if "http" and "dataone" in link.get("href"):
        print("<a href='%s'>%s</a>" %(link.get("href"), link.text))

Как вы можете видеть, я ищу URL-ссылку на конкретную базу данных (в данном случае DataONE) после того, как пользователь дал URL-адрес веб-сайта.Этот сценарий прекрасно работает, но он очищает только ту страницу, на которую я ссылаюсь, - НЕ весь сайт.Поэтому, если я предоставлю веб-сайт: https://www.lib.utk.edu/,, он будет искать только ссылки на DataONE на этой странице, но не будет искать ссылки на всех страницах веб-сайта UTK Libraries.** У меня пока недостаточно высокой репутации на этом сайте, чтобы публиковать фотографии, поэтому я не могу включить изображение этого сценария "в действии".**

Я тщательно изучил это на SO, чтобы попытаться понять, но ни один из заданных вопросов или ответов пока не относится к моей конкретной проблеме.

Примеры:
1. Как зациклить очистку данных для нескольких страниц на сайте, используя python и beautifulsoup4 : в этом конкретном вопросе ОП может узнать, сколько страниц онинужно искать, потому что их проблема относится к конкретному поиску, сделанному на сайте.Однако в моем случае я не буду знать, сколько страниц на каждом веб-сайте.
2. Используйте BeautifulSoup для циклического просмотра и получения определенных URL-адресов : Опять же, это касается анализа URL-адресов, ноон не просматривает весь веб-сайт в поисках URL.
3. Как перебрать каждую страницу веб-сайта для очистки веб-страниц с помощью BeautifulSoup : ОП здесь, похоже, борется с той же проблемой, что и у меня, но принятый ответ не дает достаточно подробностей для понимания того, КАК подходить к такой проблеме.

Я изучил документацию BeautifulSoup, но я не нашел никакой помощи в очистке всего сайта с одного URL-адреса (и не зная, сколько всего страниц на сайте).Я изучал использование Scrapy, но я не уверен, что это то, что мне нужно для моих целей в этом проекте, потому что я не пытаюсь загружать или хранить данные - я просто пытаюсь увидеть, когда и где находится определенный URLссылка на весь сайт.

Мой вопрос: возможно ли сделать что-то подобное с BeautifulSoup, и если да, то можете ли вы предложить, как мне изменить текущий код для решения моей исследовательской задачи?Или мне нужна другая программа?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вам понадобится реализовать какую-то форму гусеничного механизма.

Это можно сделать вручную;по сути, вы должны сделать это:

  1. проверить, существует ли robots.txt и проанализировать ли его URL-адреса, добавив их в список для посещения позже
  2. разобрать, какая бы ни была первая страницазаходите на дальнейшие ссылки;Вы, вероятно, будете искать все элементы <a> и анализировать их href, а затем выяснить, есть ли ссылка на тот же сайт, например, href="/info.html", но также href="http://lib.edu.org/info.html"
  3. добавить идентифицированные URL-адреса.к списку URL-адресов для посещения
  4. повторите с 2 до тех пор, пока все URL-адреса не будут посещены

Я бы порекомендовал изучить Scrapy.Он позволяет вам определить Spider, которые вы предоставляете, с информацией о том, с каких URL начинать, и , как генерировать дополнительные ссылки для посещения .У Паука есть метод parse, который вы можете использовать для поиска в вашей базе данных.В случае совпадения вы можете обновить локальную базу данных SQLite или просто записать счетчик в текстовый файл.

TL; DR: при посещении одной страницы трудно определить, какие другие страницы существуют.Вы должны проанализировать все внутренние ссылки.robots.txt может быть полезным в этом усилии, но не гарантируется, что оно существует.

0 голосов
/ 18 октября 2018

Вы можете использовать два питона sets, чтобы отслеживать страницы, которые вы уже посетили, и страницы, которые вам нужно посетить.

Также: вы, если условие неправильное, чтобы проверить оба, вы не можете использовать a and b in c, вам нужно сделать a in c and b in c

Примерно так:

import requests  
from bs4 import BeautifulSoup 


baseurl = 'https://example.org'
urls_to_check = {baseurl, }
checked_urls = set()

found_links = []
while urls_to_check:
    url = urls_to_check.pop()
    r = requests.get(url)

    soup = BeautifulSoup(r.content, features='lxml')

    links = soup.find_all("a")
    for link in links:
        if "http" in link.get("href") and "dataone" in link.get("href"):
            found_links.append("<a href='%s'>%s</a>" % (link.get("href"), link.text))
        elif link.get("href", "").startswith("/"):
            if baseurl + link.get("href") not in checked_urls:
                urls_to_check.add(baseurl + link.get("href"))
    checked_urls.add(url)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...