Веб-скрапинг вдруг кто сможет исправить последний код

Immortal

Новичок
Пользователь
Сен 15, 2022
6
1
3
Всем привет.
Задание выглядит так:
Вам необходимо написать функцию, которая будет основана на поиске по сайту habr.com. Функция в качестве параметра должна принимать список запросов для поиска (например, ['python', 'анализ данных']) и на основе материалов, попавших в результаты поиска по каждому запросу, возвращать датафрейм вида:
<дата> - <заголовок> - <ссылка на материал>
В рамках задания предполагается работа только с одной (первой) страницей результатов поисковой выдачи для каждого запроса. Материалы в датафрейме не должны дублироваться, если они попадали в результаты поиска для нескольких запросов из списка

Код пока выглядит так, но сильно нагроможден и по итогу не сработал. Вдруг кто сможет подсказать как завершить.
(подали идею - передать в метод реквест похожую строку)
Заранее благодарю!

import requests

keywords = ['парсинг']

import time

import pandas as pd

URL = 'https://habr.com/ru/search/?q=парсинг&target_type=posts&order=relevance'

from bs4 import BeautifulSoup

pages = 1

result_list = []
req = requests.get(URL)
time.sleep(0.3)
soup = BeautifulSoup(req.text)
news_blocks = soup.find_all('article', class_='tm-articles-list__item')
articles_date = list(map(lambda x: x.find('span', class_='tm-article-snippet__datetime-published').find('time').get('title'), news_blocks))
articles_title = list(map(lambda x: x.find('h2', class_='tm-article-snippet__title').find('span').get_text(), news_blocks))
articles_text = list(map(lambda x: x.find('div', class_='article-formatted-body').get_text(), news_blocks))
articles_link = list(map(lambda x: x.find('a', class_='tm-article-snippet__title-link').get('href'), news_blocks))
result_list = result_list + list(zip(articles_date, articles_title, articles_text, articles_link))

result_list
 

Immortal

Новичок
Пользователь
Сен 15, 2022
6
1
3
up
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Как вставлять код

Не надо вставлять код как скриншот или как текст (скопировав и вставив), вставляйте его как код
1647162378032-png.1702
 

Immortal

Новичок
Пользователь
Сен 15, 2022
6
1
3
Как вставлять код

Не надо вставлять код как скриншот или как текст (скопировав и вставив), вставляйте его как код
1647162378032-png.1702
Спасибо! Поправила.

Python:
import requests
keywords = ['парсинг']
import time
import pandas as pd
URL = 'https://habr.com/ru/search/?q=парсинг&target_type=posts&order=relevance'
from bs4 import BeautifulSoup
pages = 1

result_list = []
req = requests.get(URL)
time.sleep(0.3)
soup = BeautifulSoup(req.text)
news_blocks = soup.find_all('article', class_='tm-articles-list__item')
articles_date = list(map(lambda x: x.find('span', class_='tm-article-snippet__datetime-published').find('time').get('title'), news_blocks))
articles_title = list(map(lambda x: x.find('h2', class_='tm-article-snippet__title').find('span').get_text(), news_blocks))
articles_text = list(map(lambda x: x.find('div', class_='article-formatted-body').get_text(), news_blocks))
articles_link = list(map(lambda x: x.find('a', class_='tm-article-snippet__title-link').get('href'), news_blocks))
result_list = result_list + list(zip(articles_date, articles_title, articles_text, articles_link))

result_list
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Вот пример для одного ключевого слова, думаю там несложно до нескольких доработать
Python:
from bs4 import BeautifulSoup
import requests

URL = 'https://habr.com/ru/search/?q={}&target_type=posts&order=relevance'

def post_parser(post):
    post_data = {
        'title': post.find('h2').text,
        'date': post.find('time').text,
        'link': post.find('h2').a.get('href')
    }
    return f"{post_data['date']} - {post_data['title']} - {post_data['link']}"

def get_themes(keyword):
    html = BeautifulSoup(requests.get(URL.format(keyword)).text, 'lxml')
    posts = [post_parser(post) for post in html.select('article')]
    return posts

print(*get_themes('парсинг'), sep='\n')
 

Immortal

Новичок
Пользователь
Сен 15, 2022
6
1
3
Вот пример для одного ключевого слова, думаю там несложно до нескольких доработать
Python:
from bs4 import BeautifulSoup
import requests

URL = 'https://habr.com/ru/search/?q={}&target_type=posts&order=relevance'

def post_parser(post):
    post_data = {
        'title': post.find('h2').text,
        'date': post.find('time').text,
        'link': post.find('h2').a.get('href')
    }
    return f"{post_data['date']} - {post_data['title']} - {post_data['link']}"

def get_themes(keyword):
    html = BeautifulSoup(requests.get(URL.format(keyword)).text, 'lxml')
    posts = [post_parser(post) for post in html.select('article')]
    return posts

print(*get_themes('парсинг'), sep='\n')

Премного благодарю за помощь!
 
  • Мне нравится
Реакции: Vershitel_sudeb

Александр Пузырев

Новичок
Пользователь
Авг 28, 2023
1
0
1
Python:
def get_habr_posts(query):
    habr_blog = pd.DataFrame()
    for q in query:
        URL = 'https://habr.com/ru/search/'
        params = {
            'q': q
        }
        req = requests.get(URL, params=params)
        time.sleep(0.3)
        soup = BeautifulSoup(req.text)
        articles = soup.find_all('article', class_='tm-articles-list__item')
        for el in articles:
          title = el.find('a','tm-title__link').text
          link = el.find('a','tm-title__link').get('href')
          date = el.find('span', 'tm-article-datetime-published').text
          row = {'date': date, 'title': title, 'link': link}
          habr_blog = pd.concat([habr_blog, pd.DataFrame([row])])
    return habr_blog.reset_index(drop=True)

res = get_habr_posts(['python', 'data siense','красотища'])
res
 

Форум IT Специалистов