Невозможно явно передать сеанс в разных функциях - PullRequest
0 голосов
/ 21 июня 2020

Я создал сценарий в python, используя модуль запросов и библиотеку BeautifulSoup, чтобы очистить заголовки разных сообщений с их внутренних страниц, проходящих через несколько страниц, с помощью кнопки следующей страницы. Для большей ясности - скрипт анализирует ссылки с таких страниц и очищает заголовок от такой внутренней страницы .

Я создал сеанс один раз в основной функции и повторно использовал то же самое, не передавая его в разные функции (я не знаю, идеальный ли это способ).

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

link = "https://stackoverflow.com/questions/tagged/web-scraping?tab=newest&page=604&pagesize=50"
base = "https://stackoverflow.com"

def get_links(url):
    r = s.get(url)
    soup = BeautifulSoup(r.text, "lxml")
    for item in soup.select(".summary .question-hyperlink"):
        yield urljoin(base,item.get("href"))

    next_page = soup.select_one("a[rel='next']")
    if next_page:
        next_page = urljoin(base,next_page.get("href"))
        yield from get_links(next_page)

def fetch_info(link):
    r = s.get(link)
    soup = BeautifulSoup(r.text,"lxml")
    title = soup.select_one("h1 > a.question-hyperlink").text
    return title

if __name__ == '__main__':
    with requests.Session() as s:
        s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
        for item in get_links(link):
            print(fetch_info(item))

Как я могу явно передать сеанс в разных функциях, сохраняя существующий дизайн как есть?

1 Ответ

1 голос
/ 23 июня 2020

Ваш код основан на правилах Python области видимости. В ваших функциях он ищет имя s

  • в локальной области и терпит неудачу, затем
  • в включающей функции, что не относится к вашему коду
  • в глобальной области и успешно
  • во встроенных именах

Поскольку у вас нет другого сеанса, я думаю, что это нормально быть неявным в вашем случае.

Как я могу передать сеанс явно в разных функциях сохранить существующий дизайн как есть?

Ближайший один, который вы можете получить, это:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

link = "https://stackoverflow.com/questions/tagged/web-scraping?tab=newest&page=604&pagesize=50"
base = "https://stackoverflow.com"


def get_links(s, url):
    r = s.get(url)
    soup = BeautifulSoup(r.text, "lxml")
    for item in soup.select(".summary .question-hyperlink"):
        yield urljoin(base, item.get("href"))

    next_page = soup.select_one("a[rel='next']")
    if next_page:
        next_page = urljoin(base, next_page.get("href"))
        yield from get_links(s, next_page)


def fetch_info(s, link):
    r = s.get(link)
    soup = BeautifulSoup(r.text, "lxml")
    title = soup.select_one("h1 > a.question-hyperlink").text
    return title


if __name__ == '__main__':
    with requests.Session() as s:
        s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
        for item in get_links(s, link):
            print(fetch_info(s, item))
...