Как вы переходите на новую страницу при просмотре веб-страниц с BeautifulSoup? - PullRequest
0 голосов
/ 23 октября 2018

Ниже у меня есть код, который вытаскивает записи из Craigslist.Все отлично работает, но мне нужно иметь возможность перейти к следующему набору записей и повторить тот же процесс, но, будучи новичком в программировании, я застрял.Посмотрев на код страницы, я выгляжу так, как будто я должен нажимать кнопку со стрелкой, содержащуюся в диапазоне, до тех пор, пока она не будет содержать href:

<a href="/search/syp?s=120" class="button next" title="next page">next &gt; </a> 

Я подумал, что, возможно, это цикл внутри цикла, но япредположим, это тоже может быть попытка / исключение.Это звучит правильно?Как бы вы это реализовали?

import requests
from urllib.request import urlopen
import pandas as pd

response = requests.get("https://nh.craigslist.org/d/computer-parts/search/syp")

soup = BeautifulSoup(response.text,"lxml")

listings = soup.find_all('li', class_= "result-row")

base_url = 'https://nh.craigslist.org/d/computer-parts/search/'

next_url = soup.find_all('a', class_= "button next")


dates = []
titles = []
prices = []
hoods = []

while base_url !=
    for listing in listings:
        datar = listing.find('time', {'class': ["result-date"]}).text
        dates.append(datar)

        title = listing.find('a', {'class': ["result-title"]}).text
        titles.append(title)

        try:
            price = listing.find('span', {'class': "result-price"}).text
            prices.append(price)
        except:
            prices.append('missing')

        try:
            hood = listing.find('span', {'class': "result-hood"}).text
            hoods.append(hood)
        except:
            hoods.append('missing')

#write the lists to a dataframe
listings_df = pd.DataFrame({'Date': dates, 'Titles' : titles, 'Price' : prices, 'Location' : hoods})

 #write to a file
listings_df.to_csv("craigslist_listings.csv")

Ответы [ 2 ]

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

Для каждой страницы, которую вы сканируете, вы можете найти следующий URL для сканирования и добавить его в список.

Так я бы это сделал, не слишком меняя код.Я добавил несколько комментариев, чтобы вы понимали, что происходит, но оставьте мне комментарий, если вам понадобится дополнительное объяснение:

import requests
from urllib.request import urlopen
import pandas as pd
from bs4 import BeautifulSoup


base_url = 'https://nh.craigslist.org/d/computer-parts/search/syp'
base_search_url = 'https://nh.craigslist.org'
urls = []
urls.append(base_url)
dates = []
titles = []
prices = []
hoods = []

while len(urls) > 0: # while we have urls to crawl
    print(urls)
    url = urls.pop(0) # removes the first element from the list of urls
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    next_url = soup.find('a', class_= "button next") # finds the next urls to crawl
    if next_url: # if it's not an empty string
        urls.append(base_search_url + next_url['href']) # adds next url to crawl to the list of urls to crawl

    listings = soup.find_all('li', class_= "result-row") # get all current url listings
    # this is your code unchanged
    for listing in listings:
        datar = listing.find('time', {'class': ["result-date"]}).text
        dates.append(datar)

        title = listing.find('a', {'class': ["result-title"]}).text
        titles.append(title)

        try:
            price = listing.find('span', {'class': "result-price"}).text
            prices.append(price)
        except:
            prices.append('missing')

        try:
            hood = listing.find('span', {'class': "result-hood"}).text
            hoods.append(hood)
        except:
            hoods.append('missing')

#write the lists to a dataframe
listings_df = pd.DataFrame({'Date': dates, 'Titles' : titles, 'Price' : prices, 'Location' : hoods})

 #write to a file
listings_df.to_csv("craigslist_listings.csv")

Редактировать: Вы также забыли импортировать BeautifulSoup в свойкод, который я добавил в своем ответе Edit2: Вам нужно только найти первый экземпляр следующей кнопки, поскольку страница может (и в этом случае она есть) иметь более одной следующей кнопки.
Edit3: Для того, чтобы сканировать детали компьютера, base_url должен быть заменен на тот, который присутствует в этом коде

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

Это не прямой ответ о том, как получить доступ к кнопке «Далее», но это может быть решением вашей проблемы.Когда в прошлом я занимался веб-страницей, я использовал URL-адреса каждой страницы для просмотра результатов поиска.В Craiglist, когда вы нажимаете «Следующая страница», URL меняется.Обычно это изменение можно использовать в своих интересах.Мне не пришлось долго смотреть, но похоже, что вторая страница craigslist выглядит так: https://nh.craigslist.org/search/syp?s=120,, а третья - https://nh.craigslist.org/search/syp?s=240. Похоже, что последняя часть URL каждый раз меняется на 120,Вы можете создать список, кратный 120, а затем создать цикл for, чтобы добавить это значение в конец каждого URL-адреса.Тогда у вас есть текущий цикл for, вложенный в этот цикл for.

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