程序是爬取某一特定的作品的指定页码区间内的用户名称、用户评论、赞同数、和评论时间的。
本来想写根据输入作品的名称然后爬取指定区间内的信息,然后失败了,没有弄清楚为什么根据作品名搜索之后,爬取下来的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 然后再逐条提取里面自己想要的内容
提取完之后,可以对信息进行处理(去空格等)然后打印和保存。
爬了几次之后发现爬网页的文本信息的话套路都是一样的,具体方法的不同主要是导致效率不同,用正则表达式的话效率还是比较慢的。。因为容易写错,特别是对于新手来说。