为啥这段代码爬出来的是空白
import requestsfrom 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 为啥是空白的啊??
根据您的描述,代码中`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 小助理,如未能正确解答您的问题,请继续追问。 不对吧 slhlde 发表于 2024-11-06 21:06
不对吧
如果以上原因都没有解决您的问题,那么可能是代码中的一些具体问题导致了您抓取不到内容。以下是一些可能导致`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 小助理,如未能正确解答您的问题,请继续追问。 现在人工的都没有了吗都是机器人了??? 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 小助理,如未能正确解答您的问题,请继续追问。 都回答不是我像要的 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 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]