🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
关于#python#的问题 ,但生成的excel文件内无爬取的数据存在
# coding=utf-8
from bs4 import BeautifulSoup
import re
import urllib.request, urllib.error
import xlwt
findLink = re.compile(r"alt=\"(.*?)\"")
findImgSrc = re.compile(r'<div class="comment-star (?<!\d)(star\d+)"</div>')
findRating = re.compile(r'<div class="comment-time">(.*?)<\/div>')
findJudge = re.compile(r'<p class="comment-con">(.*?)<\/p>/i')
def main():
baseurl = "https://item.jd.com/100027211987.html#comment" #要爬取的网页链接
# 1.爬取网页
datalist = getData(baseurl)
savepath = "小米手环7pro.xls"
saveData(datalist,savepath)
def getData(baseurl, comment=None):
datalist = [] # 用来存储爬取的网页信息
url = baseurl + str(10)
html = askURL(url) # 保存获取到的网页源码
# 2.逐一解析数据
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="comment-item"): # 查找符合要求的字符串
data = []
item = str(comment-item)
link = re.findall(findLink, item)[0]
data.append(link)
imgSrc = re.findall(findImgSrc, item)[0]
data.append(imgSrc)
rating = re.findall(findRating, item)[0]
data.append(rating)
judgeNum = re.findall(findJudge, item)[0]
data.append(judgeNum)
return datalist
def askURL(url):
head = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36"
}
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
# 保存数据到表格
def saveData(datalist,savepath):
print("save.......")
book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
sheet = book.add_sheet('小米手环7pro', cell_overwrite_ok=True) #创建工作表
col = ("用户名","评分","日期","评价")
for i in range(0,4):
sheet.write(0,i,col[i]) #列名
for i in range(0, min(len(datalist), 10)):
data = datalist[i]
for j in range(0,4):
sheet.write(i+1,j,data[j]) #数据
book.save(savepath) #保存
# 保存数据到数据库
if __name__ == "__main__": # 当程序执行时
# 调用函数
main()
# init_db("movietest.db")
print("爬取完毕!")
该代码可以成功运行,但生成的excel文件内无爬取的数据存在,请问应如何解决?
如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。
解决方案
如下是上述问题的解决方案,仅供参考:
您的代码中存在几个问题,这可能是导致生成的Excel文件内没有数据的原因:
-
getData
函数中的URL拼接错误:在getData
函数中,您尝试通过baseurl + str(10)
来拼接URL,但这并不是一个有效的URL。您可能想要通过分页来获取数据,但是需要根据实际网页的分页机制来构造正确的URL。 -
getData
函数中comment
参数未使用:函数定义了comment
参数,但在函数体内并没有使用这个参数。 -
正则表达式使用错误:在
getData
函数中,您使用了re.findall
来查找匹配项,但是您试图从findLink
、findImgSrc
、findRating
和findJudge
的查找结果中直接使用[0]
索引,这假设了每个正则表达式至少有一个匹配项。如果没有匹配项,这将导致索引错误。 -
数据存储逻辑错误:在
for item in soup.find_all('div', class_="comment-item"):
循环中,您应该在找到每个comment-item
后将数据添加到datalist
中,但当前的逻辑是将数据添加到局部变量data
中,并没有将data
添加到datalist
。 -
saveData
函数中数据量限制:在for i in range(0, min(len(datalist), 10)):
循环中,您限制了最多只保存10条数据,即使datalist
中有更多的数据。
以下是针对上述问题的一些修正建议:
- 确保URL拼接正确,如果需要分页,需要根据实际的分页URL结构来调整代码。
- 移除未使用的
comment
参数。 - 在使用
re.findall
后,检查结果列表是否非空,然后再访问第一个元素。 - 在解析每个
comment-item
后,应该将完整的data
列表添加到datalist
中。 - 根据实际需要调整
saveData
函数中保存数据的数量限制。
修正后的getData
函数示例:
def getData(baseurl, page=None):
datalist = [] # 用来存储爬取的网页信息
if page:
url = f"{baseurl}?page={page}"
else:
url = baseurl
html = askURL(url) # 保存获取到的网页源码
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="comment-item"):
data = []
link = findLink.search(item)
if link:
data.append(link.group(1))
else:
data.append("")
imgSrc = findImgSrc.search(item)
if imgSrc:
data.append(imgSrc.group(1))
else:
data.append("")
rating = findRating.search(item)
if rating:
data.append(rating.group(1))
else:
data.append("")
judgeNum = findJudge.search(item)
if judgeNum:
data.append(judgeNum.group(1))
else:
data.append("")
datalist.append(data) # 将数据添加到datalist
return datalist
请注意,您可能还需要根据实际网页的结构调整正则表达式和BeautifulSoup的解析逻辑。此外,确保您的网络请求头User-Agent
是有效的,以避免被网站阻止。
希望如上措施及解决方案能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。