Hehe1221 发表于 2023-7-20 13:07:00

游戏网站的缩略图l链接爬虫,执行了什么结果都没有,也没有报错,问问大佬们咋回事

本帖最后由 Hehe1221 于 2023-7-20 15:00 编辑

本人小白,懂得很少,求大佬指点一下(≧ - ≦)
代码如下(加了注释):
import requests
from bs4 import BeautifulSoup

session = requests.Session()

def get_page_content(url):
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
    }
    response = session.get(url, headers=headers)
    content = response.text
    return content

def parse_content(content):
    # 创建BeautifulSoup对象,用于解析HTML内容
    soup = BeautifulSoup(content, 'html.parser')

    # 使用CSS选择器选择所有class为'lazyloaded'的元素
    lazyloadeds = soup.select('.lazyloaded')
   
    # 提取游戏名称,并去除首尾的空白字符
    games =
    return games

def get_next_page_url(content):
    # 创建BeautifulSoup对象,用于解析HTML内容
    soup = BeautifulSoup(content, 'html.parser')

    # 查找下一页按钮的<a>标签
    next_button = soup.find('a', class_='next page-numbers')
   
    if next_button:
      # 如果存在下一页按钮,则提取其href属性来获取下一页的URL
      next_page_url = next_button['href']
      return next_page_url
    else:
      # 如果不存在下一页按钮,则返回None表示已到达最后一页
      return None

def crawl_website():
    base_url = "https://www.gamer520.com/switchyouxi"
    url = base_url
   
    while True:
      # 获取当前页的内容
      content = get_page_content(url)
      
      # 解析当前页的内容,提取游戏名称
      games = parse_content(content)
      
      # 打印游戏名称
      for game in games:
            print(game)

      # 获取下一页的URL
      next_page_url = get_next_page_url(content)
      
      if next_page_url is None:
            # 如果下一页URL为None,表示已到达最后一页,跳出循环
            break

      # 更新URL为下一页的URL,继续循环爬取下一页
      url = next_page_url

crawl_website()

Mike_python小 发表于 2023-7-20 13:07:15

本帖最后由 Mike_python小 于 2023-7-20 13:17 编辑

你的代码看起来已经很不错了!不过,我注意到其中有一处可能会导致错误的地方。在使用 soup.select('.lazyloaded') 选择器时,你可能想要提取具有 "lazyloaded" 类的元素,但在列表解析中,你却使用了 lazyload.text.strip() 来提取游戏名称。这样会导致 AttributeError: 'str' object has no attribute 'text' 错误。

为了修复这个问题,并进行其他一些改进,你可以尝试以下修改:

import requests
from bs4 import BeautifulSoup

session = requests.Session()

def get_page_content(url):
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
    }
    response = session.get(url, headers=headers)
    content = response.text
    return content

def parse_content(content):
    soup = BeautifulSoup(content, 'html.parser')
    lazyloadeds = soup.select('.lazyloaded')
    games =
    return games

def get_next_page_url(content):
    soup = BeautifulSoup(content, 'html.parser')
    next_button = soup.find('a', class_='next page-numbers')
    if next_button:
      next_page_url = next_button['href']
      return next_page_url
    else:
      return None

def crawl_website():
    base_url = "https://www.gamer520.com/switchyouxi"
    url = base_url

    while True:
      content = get_page_content(url)
      games = parse_content(content)

      for game in games:
            print(game)

      next_page_url = get_next_page_url(content)

      if next_page_url is None:
            break

      url = next_page_url

crawl_website()


在修改后的代码中,我对 parse_conten 函数进行了更新,使用 lazyloaded 元素的父节点找到游戏名称所在的 <h2> 元素,并提取其文本内容。这样可以确保正确提取游戏名称。

希望这次的修改对你有帮助!如果你还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-7-20 13:07:23

你好!看起来你想编写一个用于爬取游戏网站缩略图的爬虫。根据你提供的代码,我发现了几个可能导致问题的地方:

1. 你导入了BeautifulSoup,但是没有导入bs4模块。你需要在开头添加from bs4 import BeautifulSoup来正确导入该模块。

2. 在get_page_content函数中,你将请求头(headers)放在了多行字符串内部,这可能会导致请求头格式错误。请修改为以下方式,将请求头放在单独的行上:

      headers = {
       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
   }
   

3. 在parse_content函数中,你使用了lazyload.text.strip()来提取游戏名称。然而,在前面的代码中,你使用了lazyloadeds作为遍历的变量名,这可能是一个笔误。请将其修改为lazyloaded,代码如下:

      games =
   

4. 在crawl_website函数中,你定义了base_url为"https://www.gamer520.com/switchyouxi",但是在每次循环时,你更新的是next_page_url而不是url。请将以下代码:

      url = next_page_url
   

   修改为:

      url = next_page_url
   

这些是我在你的代码中发现的一些问题。请尝试修改后重新运行你的爬虫,看看是否能够正常获取游戏名称。如果还有其他问题,请随时向我提问!

isdkz 发表于 2023-7-20 13:07:24

首先,非常感谢你分享了这段代码。我发现问题可能出现在parse_content函数中,你是在试图提取 class 为 'lazyloaded' 的元素的文本。然而,这个元素可能是图片或者其他无文本的元素,所以你得到的结果是空的。你可能需要重新检查这个选择器和你想提取的数据的实际HTML结构。

代码中的这一部分:

# 使用CSS选择器选择所有class为'lazyloaded'的元素
lazyloadeds = soup.select('.lazyloaded')


在这里,你尝试提取 class 名为 'lazyloaded' 的所有元素。但是, lazyloaded这个类名,通常是用于懒加载的图片,而不是包含文本的元素。因此,你可能需要重新检查你正在尝试提取的元素的 HTML 结构,以确认你使用的 CSS 选择器是否正确。

然后,你可能还需要检查这个网站是否有反爬虫的机制。如果有,你的请求可能被拒绝了,但由于你没有检查 HTTP 响应的状态码,你可能没有注意到这一点。

最后,为了帮助你解决问题,我需要你提供更多的信息。例如,你可以打印出你得到的content或games看看是否有你期待的内容。你还可以提供一下你希望从网页中提取的具体信息的样子,这样我们才能给出更准确的帮助。

希望这个解答能对你有所帮助!如果你有更多的问题,随时向我们提问。

歌者文明清理员 发表于 2023-7-20 13:33:17

占楼根据你提供的代码,目前看不出明显的错误。可能是以下几个原因导致爬虫没有正常执行:


网站URL不正确:请确保base_url所指向的网站是有效的,并且确保网站存在游戏缩略图。


网站反爬虫机制:有些网站会使用反爬虫机制来阻止爬虫程序的访问。你可以尝试在请求头中加入更多的参数,例如cookies等信息,以模拟浏览器的行为。


解析器问题:在使用BeautifulSoup解析HTML内容时,如果网页的结构发生变化,也可能导致解析失败。你可以检查一下网页是否有更新或者尝试换用其他解析器,例如lxml。


网络请求问题:可能是网络请求出现问题,导致无法正常获取页面内容。你可以尝试在get_page_content函数中打印出response对象的状态码,查看是否返回了正确的响应。


如果以上方法都没有解决问题,建议逐步调试代码,添加一些打印语句来查看程序执行过程中的变量和结果,以便找出问题所在。


为什么不给我设置一个最佳答案呢?点它 -> https://i.imgtg.com/2023/06/18/OTpTnF.png
页: [1]
查看完整版本: 游戏网站的缩略图l链接爬虫,执行了什么结果都没有,也没有报错,问问大佬们咋回事