最近在做毕业设计,需要收集用户的评分数据做协同过滤算法,同时收集评论数据做情感分析

坑点

  1. 豆瓣图书可以没有评分,或者用户评论了但没给评分。而且豆瓣图书的编码方式很无奈呀,热门书籍附近总是冷门书籍,无评分、无评论那种,所以经常输出failed
  2. 不能爬得太快了,每分钟只能40-50张页面,一个requests只能访问一千次,否则就报状态码403

fake_useragent的用法

在这次爬虫中使用了fake_useragent来伪造请求头,因为听说豆瓣的反爬机制比较好
fake_useragent的用法简单如下,random是随机产生一个请求头

from fake_useragent import UserAgent
import requests
ua=UserAgent()
url="https://www.baidu.com"    #请求的网址
headers={"User-Agent":ua.random}   #请求头
response=requests.get(url=url,headers=headers)   #请求网址
print(headers)
print(response.status_code)   #响应状态信息
text = response.headers
for line in text.items():print(line)

爬取豆瓣读书的图书信息和评论信息

首先需要观察的是这些的链接
https://book.douban.com/subject/26953606/ 图书信息页面
https://book.douban.com/subject/26953606/comments/ 第一页评论页面
https://book.douban.com/subject/26953606/comments/hot?p=2 第二页评论页面
可以看到前面都是相同的https://book.douban.com/subject/再加一个图书id,评论页面后面接一个/comments/,第二页评论后面接一个hot?p=2,由此递推低3页是hot?p=3
其中一些写入文本的操作,因为我是要收集数据的
第二天又修改了一下,热门图书的分布实在是太稀疏了,所以在程序里先判断评论总数是否超过一千,如果超过一千条就继续爬取,否则continue
又改bug了,是数字的,写入文件一定要将其转换成str

#coding=utf-8
#下载豆瓣图书的评分、评论,需要建立四张表。auther:wuyou
#表一:图书ID,图书名,平均分
#表二:用户ID,用户名
#表三:图书ID,热门评论
#表四:用户ID,图书ID,评分,评分时间
import requests
import time
import random
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
ua = UserAgent()
header = {'User-Agent': ua.random
}
def get_score(book_id,text):                   #获取(图书ID,图书名,图书评分)soup = BeautifulSoup(text,'lxml')try:book_name = soup.select("#wrapper > h1 > span")   #返回书名的列表name = book_name[0].stringbook_score = soup.select("#interest_sectl > div > div.rating_self.clearfix > strong")  #返回分数的列表score = book_score[0].string#print("book name is " + str(name)+" and score is "+str(score))  打印书名和分数line = str(book_id) + "," + name + "," + str(score) + "\n"   #拼接图书信息with open("BookInfo.txt","a",encoding="utf-8") as file:    #表一:图书ID,图书名,平均分file.write(line)file.close()except:print("book " + str(book_id) + "get score is  failed!")def write_txt(soup,book_id):    #参与为url,图书id,和网页页码try:     #为了防止报错,因为有些人可以不打分,那么在user_info下只有一个spancomment_list = soup.find_all("span","short")     #找到评论所在的区域comments = ""flag = 0for line in comment_list:       #把逗号全部替换成分号bc = line.stringbc = bc.replace(",","。")     #将英文逗号替换成句号bc = bc.replace(",","。")    #将中文逗号替换成句号bc = bc .replace(";","。")    #将分号替换成句号if flag == 0:     #如果是第一条评论flag += 1else:comments += ";"      #评论之间用分号间隔comments += bcwith open("BookComments.txt","a",encoding="utf-8") as file:    #表三:图书ID,热门评论BookComments = str(book_id) + "," +comments + "\n"file.write(BookComments)file.close()user_list = soup.find_all("span", "comment-info")   #找到用户和评分的所在区域user_info_txt = open("UserInfo.txt","a",encoding="utf-8")user_score_txt = open("UserScore.txt","a",encoding="utf-8")for user_info in user_list:user_name = user_info.find("a").string         #用户姓名所在的<a></a>user_url = user_info.find("a").attrs["href"]   #提取出超链接user_id = user_url.split("/")[-2]              #提取出用户idscore = user_info.find_all("span")[0].attrs["title"]   #找到用户评分的区域,得到分数time_info = user_info.find_all("span")[1].string   #提取出评分的时间time_info = time_info.split("-")score_year = time_info[0]       #截取出评论时间的年份user_info_txt.write(user_id + "," +user_name + "\n")            #表二:用户ID,用户名user_score_txt.write(user_id + "," + str(book_id) + "," + score + "," + str(score_year) + "\n")  #表四:用户ID,图书ID,评分,评分时间#print("book_id is " + book_id +" user name is " + user_name + ",id is " + user_id + ",score is " + score_info + " " + time_info)   打印出一系列信息user_info_txt.close()user_score_txt.close()except:print("cannot find!")def get_comments(soup, comment_url, book_id, page):         #获取(图书ID,图书评论),(图书ID,用户ID,用户评分),(用户ID,用户名)while page <= 2:           #爬取的页数if int(page) == 1:     #如果是第一页write_txt(soup, book_id)          #传入超链接page += 1           #页数加一else:comment_url += "hot?p=" + str(page)   #拼合链接time.sleep(random.uniform(3,6))html = requests.get(url=comment_url,headers=header)if html.status_code == 200:comment_text = html.textsoup = BeautifulSoup(comment_text,"lxml")write_txt(soup, book_id)          #传入网页内容page += 1           #页数加一#https://book.douban.com/subject/1007305/
if __name__ == '__main__':url="https://book.douban.com/subject/"startID=1007304  #起始的图书IDst = 0   #循环的起点lens=20000   #len=20000时,需要爬取的总书籍数while st < lens:           #设置st和lens是为了爬取热门书籍if startID-1007304 >=1000:print("stop! " + startID)breaktry:startID += 1           #图书id增长score_url = url + str(startID) + "/"       #图书信息的链接地址html = requests.get(url=score_url,headers=header)html.encoding = "utf-8"time.sleep(random.uniform(3, 6))  # 暂停几秒,随机数在2-4s之间if html.status_code == 200:comment_url = score_url + "comments/"  # 评论的链接地址comment_html = requests.get(url=comment_url, headers=header).texttime.sleep(random.uniform(3, 6))  # 暂停几秒,随机数在2-4s之间soup = BeautifulSoup(comment_html, "lxml")total_comments = soup.select("#total-comments")[0].stringcomment_num = total_comments.replace("全部共 ","")comment_num = comment_num.replace(" 条","")if int(comment_num) >= 1000:st +=1print(str(startID)+" is success!" + score_url + " comment_num is " + comment_num)text = html.textget_score(startID,text)get_comments(soup,comment_url,startID,1)       #获取评论信息else:print(score_url + " is failed!" + " comment_num is " + comment_num)else:print(str(startID)+" is failed!")except:print(str(startID) + " is failed!",end='')print(html.status_code)

输出如下(这是以前有输出语句时的代码的输出)

中间一堆数据省略了
这是爬取到了一些冷门书籍,评论数少得可怜,所以直接忽略了

爬取豆瓣读书的图书信息和评论信息相关推荐

  1. Python3爬虫新手项目详解:爬取豆瓣读书的前50条评论内容并显示评分。提示:有的评论不包含评分

    爬取<三体>,相关网页内容如下: https://book.douban.com/subject/2567698/comments/hot?p=1 开始之前我们先明确一下爬虫的基本步骤: ...

  2. python——利用正则表达式爬取豆瓣读书中的图书信息

    本来可以使用一条正则表达式完成图书信息的爬取,结果发现在CPU性能较差的电脑上进行爬取时耗时非常长,几乎无法将结果获取到.所以,将大的html源码先经过一次简单的匹配以获取到一个中间结果,然后再从中间 ...

  3. 爬虫项目实操三、用scrapy框架爬取豆瓣读书Top250的书名,出版信息和评分

    安装方法:Windows:在终端输入命令:pip install scrapy:mac:在终端输入命令:pip3 install scrapy,按下enter键,再输入cd Python,就能跳转到P ...

  4. python爬取豆瓣读书并进行图形化分析

    python爬取豆瓣读书并进行图形化分析 豆瓣读书网页数据爬取并保存至csv 对数据进行分析并汇成图形 绘制散点图 图形效果展示 以下代码内容大多是团队小伙伴的杰作,而本人只是为了能让更多的人学习到知 ...

  5. python爬取豆瓣读书top250并保存xls(含源码)

    python爬取豆瓣读书top250并保存xls(含源码) 又是霍霍豆瓣的一天O(∩_∩)O哈哈~. 目标网站:http://book.douban.com/top250/ 全军出击!!! 首先,按下 ...

  6. python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面

    点击蓝字"python教程"关注我们哟! 我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识 ...

  7. python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面!

    我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识一下:爬取豆瓣读书页面,Python用16行代码就搞定了! p ...

  8. 基于Python,爬取豆瓣读书源码

    记得上次分享了一个抓取豆瓣妹子美女图片的脚本,今天给大家分享一个爬取豆瓣读书的源码,也算是做个记录吧,目前已经在学习编程的路上,以后要是想写什么爬虫也可以参考参考自己收藏的一些代码,嗯,虽然我还是个代 ...

  9. python爬虫 — 爬取豆瓣最受关注图书榜

    一个简单的爬取豆瓣最受关注图书榜的小爬虫,在爬取相关信息后,将结果保存在 mongo 中 整个流程分为以下几步: (1)构造url (2)分析网页 (3)编写程序,提取信息 解析,将分别介绍以上几步 ...

最新文章

  1. Oracle中表被删除或数据被错误修改后的恢复方法
  2. apt-get卸载命令
  3. Spring 自动装配模式之byType
  4. caffe框架翻译-理解(转载)
  5. jvm(6)-java类文件结构(字节码文件)
  6. python中__init__函数以及参数self
  7. C#驱动级模拟按键操作
  8. 实习小白::(转) Cocos2d-x 3.0 开发(十五)使用UILayout布局,制作对话界面
  9. editorloop 占用_【交换机在江湖-维护无忧系列】CPU占用率高故障专题(3)-常见故障案例...
  10. 整理一些ChartControl控件属性
  11. XMind 2022 使用教程
  12. 一个废物大学生对于视频爬取的小小的总结
  13. ssl证书 嵌入式设备_ngx_http_ssl_module
  14. 阿里职级体系与薪酬全曝光,P10以上都是世界大牛!
  15. 简单易懂使用DDOS攻击
  16. 合并excel单元格的两种方法
  17. Unity HTC vive移动定位器的开发使用
  18. android基础知识1
  19. 计算机基础知识学习第七课,7、新建文件夹--电脑基础知识
  20. JavaEE:网络编程套接字

热门文章

  1. js 设置读秒验证码
  2. 《InsideUE4》-6-GamePlay架构(五)Controller
  3. [C语言] 平淡的日子里泛起光 初阶最后的战役
  4. 计算机软件工程大学排名(2015)
  5. 使用WinSCP连接阿里云轻量服务器
  6. mysql sin度数正玄值_JavaScript用Math.sin()求正弦值
  7. Markdown的语法使用
  8. ASP.Net0625金通置业企业网站
  9. Yolov5(1):Detect源码逐行解析
  10. 25-30K ☀️|网络工程师职业技巧与经典面试题✨