鱼C论坛

 找回密码
 立即注册
查看: 149|回复: 7

为啥这段代码爬出来的是空白

[复制链接]
发表于 2024-11-5 22:52:19 | 显示全部楼层 |阅读模式

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

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

x
import requests
from bs4 import BeautifulSoup

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

# 首先我们写好抓取网页的函数
def get_html(url):
    try:
        r = requests.get(url,headers=headers, timeout=30)
        r.raise_for_status()
        #这里我们知道百度贴吧的编码是utf-8,所以手动设置的。爬去其他的页面时建议使用:
        #r.endcodding = r.apparent_endconding
        r.encoding = 'utf-8'
        return r.text
    except:
        return " ERROR "


def get_content(url):
    """
        分析贴吧的网页文件,整理信息,保存在列表变量中
    """
    # 初始化一个列表来保存所有的帖子信息:
    comments = []
    # 首先,我们把需要爬取信息的网页下载到本地
    html = get_html(url)
    # 我们来做一锅汤
    soup = BeautifulSoup(html, 'html.parser')
    # print(soup.prettify())
    # 按照之前的分析,我们找到所有具有‘ j_thread_list clearfix’属性的li标签。返回一个列表类型。
    liTags = soup.find_all('li', attrs={'class': ' j_thread_list clearfix thread_item_box'})
    print('litags:',liTags)
    for li in liTags:
        comment = {}
        try:
            comment['title'] = li.find('a', attrs={'class': 'j_th_tit '}).text.strip()
            comment['link'] = "http://tieba.baidu.com/" + li.find('a', attrs={'class': 'j_th_tit '})['href']
            comment['name'] = li.find('a', attrs={'class': 'frs-author-name j_user_card '}).text.strip()
            comment['time'] = li.find('span', attrs={'class': 'threadlist_reply_date pull_right j_reply_data'}).text.strip()
            comment['replyNum'] = li.find('span', attrs={'class': 'threadlist_rep_num center_text'}).text.strip()
            comments.append(comment)
        except:
            print("bad wrong")
    return comments


def Out2File(dict):
    """
    将爬取到的文件写入到本地
    保存到当前目录的 TTBT.txt文件中。
    """
    with open('TTBT.txt', 'w', encoding='utf-8') as f:
        for comment in dict:
            f.write('标题: {} \t 链接:{} \t 发帖人:{} \t 发帖时间:{} \t 回复数量: {} \n'.format(
                comment['title'], comment['link'], comment['name'], comment['time'], comment['replyNum']))
        print('当前页面爬取完成')

def main(base_url, deep):
    url_list = []
    # 将所有需要爬去的url存入列表
    for i in range(0, deep):
        url_list.append(base_url + '&pn=' + str(50 * i))
    print('所有的网页已经下载到本地! 开始筛选信息。。。。')

    #循环写入所有的数据
    for url in url_list:
        content = get_content(url)
        Out2File(content)
    print('所有的信息都已经保存完毕!')


base_url = 'https://tieba.baidu.com/f?kw=python&ie=utf-8'
# 设置需要爬取的页码数量
deep = 3

if __name__ == '__main__':
    main(base_url, deep)

liTags 为啥是空白的啊??

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-5 23:12:04 | 显示全部楼层
根据您的描述,代码中`liTags`为空,可能是因为没有正确获取到对应网页中的元素。以下几点可能导致这种情况:

1. **网页结构变化**:您可能在代码中根据网页的特定结构来筛选元素,但如果网页的HTML结构改变(例如实用的class名变化),您的代码可能就无法正常抓取数据。以`liTags = soup.find_all('li', attrs={'class': ' j_thread_list clearfix thread_item_box'})`为例,确认正确的class名称。

2. **User-Agent问题**:有些网站会检测访问请求的User-Agent信息,并阻止非浏览器的请求。检查您使用的User-Agent,确保它能模拟一个正常的浏览器请求。您已经设置了一个常见的User-Agent,但有时网站仍可能有其他反爬机制。

3. **JavaScript加载内容**:一些网站的内容是由JavaScript动态加载的,requests库无法执行JavaScript,因此无法获取这些动态内容。在这种情况下,使用诸如Selenium这样的工具模拟浏览器更合适。

4. **反爬措施**:有些网站可能具备更复杂的反爬措施,导致请求结果和您在一般浏览器中看到的不一致。

5. **网络问题**:确保网络连接正常,并且请求的目标网站可以访问。

建议执行以下步骤来排查问题:

- **检查HTML内容**:在抓取网页后,打印`html`内容以确认实际返回的网页内容。
- **手动验证**:在浏览器中打开相同的URL,使用开发者工具查看HTML结构,确认您需要的数据确实存在,并且class名与代码中一致。
- **检查异常情况**:在代码中的`get_html`函数,尤其在打印(log)请求状态码以确认是否请求成功(状态码200)。
- **尝试使用其他工具**:如问题依旧未解决并且网站是JavaScript动态加载内容,考虑使用Selenium。

通过这些步骤,您应该能更好地理解问题所在并做进一步的调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 21:06:17 | 显示全部楼层
不对吧  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 21:22:51 | 显示全部楼层


如果以上原因都没有解决您的问题,那么可能是代码中的一些具体问题导致了您抓取不到内容。以下是一些可能导致`liTags`为空的典型错误:

1. **变量初始化缺失**:确保在函数`get_content`中有正确地初始化列表`comments`。当前代码中可能使用了不正确的语法初始化:
comments = []

2. **HTML结构的准确查询**:百度贴吧的页面结构可能使用单引号或多个类选择器,这可能导致`find_all`不能精确匹配到目标元素。仔细检查您要抓取的`li`标签的class属性,并在确保确切匹配后进行修改。

3. **频繁请求触发限制**:频繁访问可能导致对方服务器限制您的请求,使用少量延时(如`time.sleep()`)在请求之间。

4. **调试信息**:通过在抓取步骤后直接输出`html`到控制台:
print(html)
   检查内容是否如预期,如果是空的或与预期不符,可以帮助定位问题。

5. **URL正确性**:最后确认您访问的URL是否正确,假如有特殊字符,建议在访问前对URL进行检查。

请尝试以上步骤,确认问题的具体原因,再对症解决。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-7 21:42:30 | 显示全部楼层
现在人工的都没有了吗  都是机器人了???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-7 21:44:59 | 显示全部楼层
slhlde 发表于 2024-11-07 21:42
现在人工的都没有了吗  都是机器人了???


抱歉如果之前的回答没有解决您的问题。让我们更直接地看看代码的潜在问题:

1. **列表初始化**:在`get_content`函数中确保正确初始化`comments`列表:
comments = []

2. **检查HTML结构**:由于网页可能变化,确保`class`选择器正确。在浏览器中使用开发者工具审查真实的HTML结构,可能需要更新选择器:
liTags = soup.find_all('li', class_='j_thread_list clearfix thread_item_box')

3. **检查提取步骤的逻辑**:在提取信息的部分,您覆盖了`comment`变量,应该将信息存储到字典:
comment['title'] = li.find('a', class_='j_th_tit ').text.strip()
   comment['link'] = "http://tieba.baidu.com" + li.find('a', class_='j_th_tit ')['href']
   comment['author'] = li.find('a', class_='frs-author-name j_user_card ').text.strip()
   comment['date'] = li.find('span', class_='threadlist_reply_date pull_right j_reply_data').text.strip()
   comment['replies'] = li.find('span', class_='threadlist_rep_num center_text').text.strip()

4. **更新代码拼接**:在保存数据步骤中,使用字典键正确输出:
comments.append(comment)

5. **流程更新**:更新写文件部分使用字典的数据格式:
def Out2File(comments):
       with open('TTBT.txt', 'w', encoding='utf-8') as f:
           for comment in comments:
               f.write('标题: {} \t 链接:{} \t 发帖人:{} \t 发帖时间:{} \t 回复数量: {}\n'.format(
                   comment['title'], comment['link'], comment['author'], comment['date'], comment['replies']))
           print('当前页面爬取完成')

请按照这些步骤调试您的程序。希望这些建议对您有帮助!如果还有问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 23:15 | 显示全部楼层
都回答不是我像要的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 23:25 | 显示全部楼层
slhlde 发表于 2024-11-19 23:15
都回答不是我像要的


抱歉给您带来了困扰。让我们仔细看一下代码,并明确指出一些需要修正的问题:

1. **列表初始化**:您需要在`get_content`函数中正确初始化`comments`列表,目前代码中这一行遗漏了变量的初始化。

comments = []

2. **HTML结构**:确保使用的`class`名是正确的。在使用`BeautifulSoup`时,`find_all`中指定的`class`名需要完全匹配目标网页中的实际`HTML`结构。可能需要再次检查百度贴吧中帖子的列表项标签的真实`class`名。

liTags = soup.find_all('li', class_='j_thread_list clearfix thread_item_box')

3. **注释和逻辑问题**:在解析帖子信息时,当前代码中您将多个属性分配给同一个`comment`变量,这会导致信息覆盖。`comment`应该是一个字典,要在字典中以正确的键存储每个信息。

for li in liTags:
       comment = {}
       try:
           title_tag = li.find('a', class_='j_th_tit')
           comment['title'] = title_tag.text.strip()
           comment['link'] = "http://tieba.baidu.com" + title_tag['href']
           
           author_tag = li.find('a', class_='frs-author-name j_user_card')
           comment['author'] = author_tag.text.strip()
           
           time_tag = li.find('span', class_='threadlist_reply_date pull_right j_reply_data')
           comment['time'] = time_tag.text.strip()
           
           reply_num_tag = li.find('span', class_='threadlist_rep_num center_text')
           comment['reply_num'] = reply_num_tag.text.strip()
           
           comments.append(comment)
       except Exception as e:
           print("Error parsing comment:", e)

4. **输出文件格式**:在将信息输出到文件时,确保在`Out2File`函数中正确访问字典中的值:

def Out2File(comments):
       with open('TTBT.txt', 'w', encoding='utf-8') as f:
           for comment in comments:
               f.write('标题: {} \t 链接:{} \t 发帖人:{} \t 发帖时间:{} \t 回复数量: {}\n'.format(
                   comment['title'], comment['link'], comment['author'], comment['time'], comment['reply_num']))
           print('当前页面爬取完成')

请确保按上面所述检查这些地方,这应该能帮助您获取到期望的数据。如果问题仍然存在,请进一步描述具体的错误信息或问题,我会继续为您提供帮助。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 16:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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