Подпишись
на новые статьи

Просто введи свой e-mail:

Получаем число объявлений и текст объявлений в регионе по заданным ключам

Начал изучать Python, и пробую писать небольшие скрипты, за ошибки в коде не судите строго.

На странице https://yandex.ru/search/ads? показываются все объявления по введенному поисковому запросу в определенном городе.

В правой части показывается общее число объявлений для региона, из которого запрос.  За регион выдачи отвечает параметр lr в url странице, скопируйте его, он потребуется при запуске скрипта.

Скрипт ниже считывает значения, сколько всего нашлось объявлений по заданным ключам.

Для запуска нужен python 3.  Он бесплатный, скачать можно по ссылке https://www.python.org/download/releases/3.0/

Сохраните текст кода ниже в файл и сохраните под именем getRivals.py

В текстовый файл сохраните все ключи, по которым хотите собрать число конкурентов и положите вместе со скриптом. Каждый ключ с новой строки, кодировка файла UTF-8

Запуск скрипта выполняется командой 

python getRivals.py keywords.txt 36

где последние два значение это имя текстового файла и номер региона 

По окончанию работы в той же папке будет файл (имя файла с ключами).out.txt, где после ключей, через точку с запятой, идет число найденных объявлений:

….…...
пицца с бесплатной доставкой ставрополь; 17
пицца доставка бесплатно; 15
заказ доставка пиццы; 10
заказ пиццы +в ставрополе; 11
пицца +в ставрополе доставкой; 12

………….

Обновление: в версии ниже сохраняются тексты объявлений в csv файл (кодировка UTF-8)

 

# coding: utf-8
import sys, os, time, math
import requests
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
headers = {'user-agent': 'my-app/0.0.1'}
pd.describe_option('display')
df = pd.DataFrame(columns=['keyword', 'header','path', 'sitelinks',
                           'text', 'refinement', 'phone', 'worktime', 'city'])

def getAds(key, region, page=0):
    response = requests.get('https://yandex.ru/search/ads?text='+key+'&lr='+str(region)+'&p='+str(page),
                            headers = headers,
                            stream = True)
    return response


def parseAd (ad):
    res = {}
    serpline =''
    res['header'] = ad.h2.get_text()
    res['text'] = ad.find('div', class_='organic__text').get_text()
    res['sitelinks'] = ad.select('.sitelinks a')
    res['sitelinks'] = '||'.join(map(BeautifulSoup.get_text, res['sitelinks']))
    try:
        res['path'] = ad.select('.path a.link')[0].get_text()
    except:
        res['path'] = ''
    serpline = ad.select('.serp-meta2 .serp-meta2__line')
        
    if len(serpline)==1:
        res['refinement'] = ''
        try:
            res['phone'] = serpline[0].select('.serp-meta2__item')[1].get_text()
        except:
            res['phone'] = ''
        try:    
            res['time'] = serpline[0].select('.serp-meta2__item')[2].get_text()
        except:
            res['time'] = ''
        try:    
            res['city'] = serpline[0].select('.serp-meta2__item')[3].get_text()    
        except:
            res['city'] = ''
    elif len(serpline)==2:
      
        try:
            res['phone'] = serpline[1].select('.serp-meta2__item')[1].get_text()
        except:
            res['phone'] = ''
        try:    
            res['time'] = serpline[1].select('.serp-meta2__item')[2].get_text()
        except:
            res['time'] = ''
        try:    
            res['city'] = serpline[1].select('.serp-meta2__item')[3].get_text()    
        except:
            res['city'] = ''
        try:
            res['refinement'] = serpline[0].select('.serp-meta2__item')
            res['refinement'] = '||'.join(map(BeautifulSoup.get_text, res['refinement']))    
        except:
            res['refinement'] = ''
    
        
    return res

def parseAds (ads, key):
    global df
    for ad in ads:
        parsad = parseAd(ad)
        parsad.update({'keyword':key})
        df = df.append (pd.Series(parsad), ignore_index=True)

                
def parse(key, region):
    global df
    
    tree = getAds(key, region)
    soup = BeautifulSoup(tree.content, 'html.parser')
    try:
        totalAds = soup.find('div', class_='serp-adv__found').string
        totalAds = totalAds.split(' ')[1]
    except:
        print('Строка не найдена')
        totalAds = 0

    print (key, '- total ads: ', totalAds)
    totalAds = int(totalAds)
    if totalAds==0:
        return 0
    else:    
        ads = soup.select('li.serp-adv-item > div')
        parseAds(ads, key)
        if totalAds>10:
            pages = math.ceil(totalAds/10)+1
            for page in range(1, pages):
                tree = getAds(key, region, page)
                soup = BeautifulSoup(tree.content, 'html.parser')
                ads = soup.select('li.serp-adv-item > div')
                parseAds(ads, key)
        return totalAds
                
      

 


def main():
    if len (sys.argv) < 3:
        print ("Пример вызова: getRivals.py input.txt regionId")
    else:
        if os.path.isfile(sys.argv[1]):
            outFileName = sys.argv[1].split('.')[0]+'.out.csv'
            with open(sys.argv[1], 'r', encoding='utf-8') as f:
                for line in f.readlines():
                    print(line)
                    key=line[:line.find('-')]
                    print(key+";", parse(key, sys.argv[2] ))
            df.to_csv(outFileName, sep='\t', encoding='utf-8', index = False)  
            print ('файл %s создан' % outFileName)
        else:
            print ('Файл не найден')
main()

Автор: Дата создания:

Комментарии (0)







Разрешённые теги: <b><i><br>Добавить новый комментарий: