鱼C论坛

 找回密码
 立即注册
查看: 2271|回复: 4

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

[复制链接]
发表于 2023-7-20 13:07:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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 = [lazyload.text.strip() for lazyloaded in lazyloadeds]
    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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 = [lazyloaded.parent.find_next('h2').text.strip() for lazyloaded in lazyloadeds]
    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> 元素,并提取其文本内容。这样可以确保正确提取游戏名称。

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 = [lazyloaded.text.strip() for lazyloaded in lazyloadeds]   
4. 在crawl_website函数中,你定义了base_url"https://www.gamer520.com/switchyouxi",但是在每次循环时,你更新的是next_page_url而不是url。请将以下代码:

   url = next_page_url   
   修改为:

   url = next_page_url   
这些是我在你的代码中发现的一些问题。请尝试修改后重新运行你的爬虫,看看是否能够正常获取游戏名称。如果还有其他问题,请随时向我提问!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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  看看是否有你期待的内容。你还可以提供一下你希望从网页中提取的具体信息的样子,这样我们才能给出更准确的帮助。

希望这个解答能对你有所帮助!如果你有更多的问题,随时向我们提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 13:33:17 | 显示全部楼层
占楼根据你提供的代码,目前看不出明显的错误。可能是以下几个原因导致爬虫没有正常执行:


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


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


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


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


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


为什么不给我设置一个最佳答案呢?点它 ->

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 18:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表