Необходима помощь с парсером!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()