Ваш код основан на правилах 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))