Соскребая каждое изображение из поиска Craigslist - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь извлечь каждый URL-адрес изображения из поиска в craigslist, но, похоже, не могу перейти к самому URL. Когда я пытаюсь soup.find_all("a", { "class":"result-image gallery"} )[0].img, он ничего не возвращает.

В частности, страница, которую я пытаюсь почистить, https://raleigh.craigslist.org/search/rea?query=duplex&sort=date&availabilityMode=0&sale_date=all+dates.

Я пытаюсь получить изображение на следующем src: https://images.craigslist.org/00j0j_cC4PhAMdHLj_300x300.jpg

Очень расстраивает то, что я смог успешно сделать это вчера, но в то время не передавал этот рабочий код на Github. С тех пор я случайно удалил его и не могу понять, что я первоначально сделал, чтобы сделать эту работу: (

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Вам стоит попробовать автоматизировать selenium библиотеку.он позволяет вам отбирать данные страницы запроса динамического рендеринга (js или ajax).

from selenium import webdriver
from bs4 import BeautifulSoup
import time
from bs4.element import Tag

driver = webdriver.Chrome('/usr/bin/chromedriver')
driver.get('https://raleigh.craigslist.org/search/rea?query=duplex&sort=date&availabilityMode=0&sale_date=all+dates')
time.sleep(3)

soup = BeautifulSoup(driver.page_source,'lxml')
rowArray = soup.find_all("li", { "class":"result-row"})

for row in rowArray:
    img = row.find("img")
    if img is None:
        continue
    if isinstance(img,Tag) and img.has_attr("src"):
        print(img['src'])
        print("----------------") 

O / P:

https://images.craigslist.org/00U0U_azwRntzeNXr_300x300.jpg
----------------
https://images.craigslist.org/00101_h0xsGArMWPh_300x300.jpg
----------------
https://images.craigslist.org/00J0J_2EzptPF9ysn_300x300.jpg
----------------
https://images.craigslist.org/00101_2FiqAHsu509_300x300.jpg
----------------
https://images.craigslist.org/00D0D_jQbpUTsk6o3_300x300.jpg

где '/usr/bin/chromedriver' путь к веб-драйверу селена.

Загрузка веб-драйвера selenium для браузера Chrome:

http://chromedriver.chromium.org/downloads

Установка веб-драйвера для браузера Chrome:

https://christopher.su/2015/selenium-chromedriver-ubuntu/

Учебник Selenium:

https://selenium -python.readthedocs.io /

0 голосов
/ 31 мая 2019

Вам нужны только запросы и целевая страница.

Вы можете создать из идентификаторов на странице (и получить все изображения для каждого свойства)

Атрибут data-ids предоставляет список идентификаторов для связанных изображений, которые вы можете использоватьпостроить каждое изображение URL.

<a href="https://raleigh.craigslist.org/reo/d/rocky-mount-off-market-multifamily/6892616013.html" class="result-image gallery" data-ids="1:00j0j_cC4PhAMdHLj"><img alt="" class="" src="https://images.craigslist.org/00j0j_cC4PhAMdHLj_300x300.jpg">
    <span class="result-price">$99000</span>
</a>
from bs4 import BeautifulSoup as bs
import requests

image_url = 'https://images.craigslist.org/{}_300x300.jpg'
r = requests.get('https://raleigh.craigslist.org/search/rea?query=duplex&sort=date&availabilityMode=0&sale_date=all+dates')
soup = bs(r.content, 'lxml')
ids = [item['data-ids'].replace('1:','') for item in soup.select('.result-image[data-ids]')] 
images = [image_url.format(j) for i in ids for j in i.split(',')]
print(images)
0 голосов
/ 31 мая 2019

Кажется, вы пытаетесь получить только первый URL-адрес изображения. Поэтому вы можете просто использовать find вместо find_all.

Кроме того, чтобы получить URL, вам также необходимо получить атрибут src от img.

soup.find("a", { "class":"result-image gallery"} ).img["src"]
...