Необходима помощь с парсером!Help!

нужна помощь добрых людей!я новичёк,от слова "совсем" Так сложилось ,что очень необходим парсер.Кто может подскажите,как это доработать.Что бы не только на одной странице парсить номер,а перейти на следущую и там тоже сохранить тел.

from selenium import webdriver
from time import sleep
from PIL import Image
from pytesseract import image_to_string
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class Bot:
    def __init__(self):
        self.driver = webdriver.Firefox()
        self.navigate()
        wait = WebDriverWait(self.driver, 10)

    def take_screenshot(self):
        self.driver.save_screenshot('avito_screenshot.png')

    def tel_recon(self):
        image = Image.open('tel.png')
        print(image_to_string(image))

        f = open('number.txt', 'a')
        f.write(image_to_string(image)+ '\n')
        f.close()

        def crop(self, location, size):
        image = Image.open('avito_screenshot.png')
        x = location['x']
        y = location['y']
        width = size['width']
        height = size['height']

        image.crop((x, y, x+width, y+height)).save('tel.png')
        self.tel_recon()

        def navigate(self):
        self.driver.get('https://www.avito.ru/volgogradskaya_oblast_volzhskiy/avtomobili/gaz_gazel_2747_2007_1903589701')

        button = self.driver.find_element_by_xpath('//a[@class="button item-phone-button js-item-phone-button button-origin contactBar_greenColor button-origin_full-width button-origin_large-extra item-phone-button_hide-phone item-phone-button_card js-item-phone-button_card contactBar_height"]')
        button.click()

        sleep(15)

        self.take_screenshot()

        image = self.driver.find_element_by_xpath('//div[@class="item-phone-big-number js-item-phone-big-number"]//*')
        location = image.location   # dict {'x': 2343, 'y': 23423}
        size = image.size           # dict {'width': 234, 'height': 234}

        self.crop(location, size)           

def main():
    b = Bot()

if __name__ == '__main__':
    main()

Пробовал явное ожидание,weit,циклы.Сильно не пинайте за безграмотность)и какие библиотеки устанавливать?


Ответы (1 шт):

Автор решения: BlueScreen

Я использовал ChromeWebDriver, потому что он у меня был под рукой, но вы можете использовать любой другой, как вам удобнее

Вместо скриншотов быстрее и проще скачать изображение непосредственно с их сайта

Импортируем библиотеки

from selenium import webdriver
import time
from bs4 import BeautifulSoup as BS
import requests #pip3 install requests
import csv
import config
import base64
from pytesseract import image_to_string
from PIL import Image

headers = config.headers
driver = webdriver.Chrome()
FILENAME = config.file_name


После этого объявим функции для (cм. коментарии)

def get_text_by_img_file_name(file_name):  #перевод в изображение
    img = Image.open(file_name)
    print(image_to_string(img))

def parse_phone(url, scr_name):  #Ищем картинку телефона
    global driver
    print((url))
    driver.get("https://" + url)

    html = driver.page_source
    soup = BS(html, "html.parser")

    try:
        name = soup.find("span", {"class":"title-info-title-text"}).get_text().replace(",","")
    except:
        name = "None"

    try:
        cost = soup.find("span", {"class":"js-item-price"}).get_text().replace(",","")
    except:
        cost = "None"

    try:
        seller_info = soup.find("div", {"class":"seller-info-col"}).get_text().replace("\n"," ").replace(",","")
    except:
        seller_info = "None"

    try:
        address = soup.find("span", {"class":"item-address__string"}).get_text().replace("\n"," ").replace(",","")
    except:
        address = "None"

    try:
        seller_name = soup.find("span", {"class":"seller-info-value"}).get_text().replace("\n"," ").replace(",","")
    except:
        seller_name = "None"

    time.sleep(8)
    button = driver.find_element_by_class_name("item-phone-button-sub-text")
    button.click()
    time.sleep(1)
    try:

        image = driver.find_element_by_xpath('//div[@class="item-phone-big-number js-item-phone-big-number"]/img')   #Вот путь к картинке
        image_src = image.get_attribute('src').split(',')[1]
        img = base64.decodebytes(bytearray(image_src, 'utf-8'))
        with open(scr_name, "wb") as f:
            f.write(img)
    except:
        scr_name = "None"


    print({"name":name,
            "cost":cost,
            "seller":seller_info,
           "seller_name":seller_name,
           "address":address,
            "scr":scr_name,
           "url":url
           })

    return ({"name":name,
            "cost":cost,
            "seller":seller_info,
           "seller_name":seller_name,
           "address":address,
            "scr":scr_name.replace(",",""),
           "url":url
           })



def get_number_of_pages(soup):   
    return config.max_page


def get_links(search_url):   #Возвращает массив ссылок на найденые товары по данной ссылке
    global headers
    result = []
    max_page = get_number_of_pages('')
    for page_number in range(1, max_page+1):
        r = requests.get(search_url + "&p=" + str(page_number), headers)
        soup = BS(r.content, "html.parser")
        table = soup.find("div", {"class":"index-root-2c0gs"})
        objects = table.find_all("div", {"class":"description item_table-description"})
        print("Find ", str(len(objects)) + " on page " + str(page_number))
        for object in objects:
            link = "avito.ru" + object.find("a",{"class":"snippet-link"}).get("href")
            result.append(link)
    return result



def save_to_csv(data):   #Для сохранения в Excel
    global FILENAME
    with open(FILENAME, "w", newline="", encoding = 'utf-8') as file:
        columns = []
        for i in data[0].keys():
            columns.append(i)

        writer = csv.DictWriter(file, fieldnames=columns)
        writer.writerows(data)

Функция main()

def main():
    data = []  #Cоздаём массив результата
    links = get_links(config.url)   #Возвращаем список ссылок на товары
    for i, link in enumerate(links):
        data.append(parse_phone(url=link,scr_name= "screenshort" + str(i) + ".png"))   #поочерёдно парсерим ссылки
    save_to_csv(data)   #Сохраняем

И соответственно точка входа

if __name__ == '__main__':
    main()
→ Ссылка