【Python学习记录】爬虫笔记2——爬取豆瓣评论

5 篇文章 0 订阅
3 篇文章 0 订阅

程序是爬取某一特定的作品的指定页码区间内的用户名称、用户评论、赞同数、和评论时间的。
本来想写根据输入作品的名称然后爬取指定区间内的信息,然后失败了,没有弄清楚为什么根据作品名搜索之后,爬取下来的html代码只显示部,在这里插入图片描述
如图所示该标签的root部分的信息是没有的。。我尝试了在请求头加入登陆之后的cookies之后依然无法获取该部分信息,想了想有点头疼…还是先放着吧,哪一天明白原理了再去深究好了。。(万一有人看这个博客并且知道原理,请告诉博主…)
先上代码(不只是黑色的部分…还有开头的库的导入和最后对象的生成和调用,这部分不知道为什么没有黑色背景的格式。。)
import re
import requests
from bs4 import BeautifulSoup
class DB_Comment():

def __init__(self):
    self.base_url = "https://movie.douban.com/subject/26266893/comments?start="
    self.reg_name = '<div class=".*">.*?<a href=".*/" title="(.*?)">'  #姓名的正则
    self.reg_comment ='<div class=".*">.*<p class="">.*"short">(.*?)</span>'  #评论的正则
    self.reg_time ='<div class=".*">.*comment-time " title="(.*?)">'         #时间正则
    self.reg_agree ='<div class=".*">.*class="votes">(.*?)</span>'           #赞同数正则
    self.headers ={"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
    self.num=0
def get_inf(self):
    page_start  = input("输入起始页码")
    page_end  = input("输入终止页码")
    for t in range(int(page_start)*20-20,int(page_end)*20-20+1,20):
        url =self.base_url + str(t)
        self.html = requests.get(url, self.headers).text
        self.soup = BeautifulSoup(self.html,"lxml")    #通过xml解析器取解析html 转换成相应文件
        self.First_result = self.soup.find_all(class_="comment-item")  # 第一次把整条扒下来
        self.deal_inf()

def deal_inf(self):
    for i in range(len(self.First_result)):
        self.Comment_agree = re.findall(self.reg_agree, str(self.First_result[i]), re.S)[0].strip()
        self.Comment_time = re.findall(self.reg_time, str(self.First_result[i]), re.S)[0].strip()
        self.Comment_comment = re.findall(self.reg_comment, str(self.First_result[i]), re.S)[0].strip()
        self.Comment_name = re.findall(self.reg_name, str(self.First_result[i]), re.S)[0].strip()
        #self.list = [self.Comment_name,self.Comment_comment]
        self.print_inf()
        self.save_inf()
def save_inf(self):
    with open("Douban.txt","a",newline="",encoding="utf-8") as f:
       self.num+=1
       f.write("用户"+str(self.num)+": "+self.Comment_name+'\n')
       f.write("点赞数: " + self.Comment_agree + '\n')
       f.write("评论内容: "+self.Comment_comment+'\n')
       f.write("评论日期: " + self.Comment_time + '\n')
def print_inf(self):
    print("用户" +str(self.num)+": "+self.Comment_name)
    print("点赞数: " + self.Comment_agree)
    print("评论内容: " + self.Comment_comment)
    print("评论日期: " + self.Comment_time)

Fun = DB_Comment()
Fun.get_inf()

正则写的很low…因为是初学的原因想尝试用正则来爬取相应的信息(也可以用解析库来爬),然后正则也写的很烂,不过至少能爬了…~。
在这里插入图片描述
思路如下
进入开发者模式观察源码写正则,因为要爬取指定区间内页码的信息,所以要观察地址栏参数的变化来完成url的拼接。
在这里插入图片描述
首页信息如下,然后翻页
在这里插入图片描述

可以发现参数发生了变化,然后地址栏中事实上存在着多余的信息,我们可以尝试逐个删除然后观察是否能正常访问该网页。
最后保留有用的参数 然后按规律进行拼接url
在这里插入图片描述
在这里插入图片描述
可以根据开发者模式下的定位(不知道可以看我的第一个python笔记)来查找指定部分的代码然后写正则,通过观察可以发现一个界面有若干个comment-item属性,因此可以用re库来匹配所有满足条件的icomment-item 然后再逐条提取里面自己想要的内容
提取完之后,可以对信息进行处理(去空格等)然后打印和保存。
爬了几次之后发现爬网页的文本信息的话套路都是一样的,具体方法的不同主要是导致效率不同,用正则表达式的话效率还是比较慢的。。因为容易写错,特别是对于新手来说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值