欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬虫——大众点评——商户评论

程序员文章站 2022-05-02 22:17:11
...

抓取内容:大众点评-北京-海淀区-美食商户-近三个月内的评论

1 、需要的配置:chrome浏览器,python的selenium包,selenium
启动selenium,执行下面代码,之后可以看到一个新的chrome图标,是一个测试的浏览器,在那里登陆大众点评的账号(爬取部分2、信息需要登陆,在程序里执行不方便,登陆一次就可以获取cookie)
3、需要爬虫服务的可以联系Q,739848314

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
import time
import pandas as pd
import json
#放chromedriver的文件路径加文件名
CHROME_DRIVER = 'C:\\Users\\Administrator\\Desktop\\chromedriver_win32\\chromedriver.exe'
 
 
'''# 创建chrome参数对象,这一段可以根据自己需求百度,尽量提高爬虫速度
opt = webdriver.ChromeOptions()
opt.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
options=opt)'''
#设置浏览器参数
driver = webdriver.Chrome(executable_path=CHROME_DRIVER)
 
#href文件是要爬取的链接库,如果只需要爬取一个文件,只需要设置href为网址
href=pd.read_csv('mer_info.csv',encoding='GBK')
href = href ['href']
driver.get(href[0])
#打开网站后手动登陆一下大众点评,再执行下面的语句

4、获取cookie,之后可以选择保存在文件里,也可以直接读取

#获取cookies
cookies = driver.get_cookies()
'''f1 = open('cookie.txt', 'w')
f1.write(json.dumps(cookies))
f1.close
f1 = open('cookie.txt')
cookie = f1.read()
cookie =json.loads(cookie)'''

5、爬虫程序

#加载cookie,之后载入的界面会自动登陆
driver.add_cookie(cookies[0])
#抓取标签,自定义函数x是返回的list,y是内容的xpath路径,z是需要get的属性
def get_tag(x,y,z):
    xpath = y
    doc = driver.find_elements_by_xpath(xpath)
    x=[c.get_attribute(z) for c in doc]
    #x = x+b
    return x
 
#定义一些空列表
#list(range(0,len(href))
 
user_id = []
comment_time = []
comennt1 = []
comment2=[]
 
#更改第下面的range里面的参数,100-200,200-300,300-400,400-500,500-600,600-len(href)
for i in list(range(0,len(href)):
    #载入网址,大众点评的网址还是很规律的,除了主页网址,商户地址就是shop/商户号,用户地址就是 
    #member/用户号,搜索就是搜索字符的转码
    url = href[i] + '/review_all'
    driver.get(url)
    
    #评论页面循环
    for m in list(range(0,100)):
        #选取特定时间评论的内容
        comment_time = driver.find_elements_by_class_name('time')
        comment_time = [n.text.split(' ')[0] for n in comment_time]
        x = pd.DataFrame({'time':comment_time})
        x['time']=pd.to_datetime(x['time'],format = '%Y-%m-%d %H:%M')
 
        #如果该页评论时间中,在2018年7月27日之后评论的数量少于2个,就不抓取
        if sum(x['time'] > pd.to_datetime('2018-7-27 15:00',format = '%Y-%m-%d %H:%M'))<=2:
            break
        else:
            #抓取评论用户的id
            user_id = get_tag(user_id,'//*[@id="reviewlist"]/div[2]/div[1]/div[3]/div[3]/ul/li/div/div[1]/a','href')
            #自动点开展开评论
            for j in list(range(1,25)):
                try:
                    driver.find_element_by_link_text('展开评论').click()
                except:
                    break
            
 
            #抓取用户评论的字数,如果要评论只需要把len函数去掉即可,但是大众点评随机把文字替换成了图片,抓取的评论会有很多的缺失
            comment1 = driver.find_elements_by_xpath('//*[@id="review-list"]/div[2]/div[1]/div[3]/div[3]/ul/li/div/div[3]')
            comment2 = driver.find_elements_by_xpath('//*[@id="review-list"]/div[2]/div[1]/div[3]/div[3]/ul/li/div/div[4]')
 
            if len(comment2)==0:
                comment1 = driver.find_elements_by_xpath('//*[@id="review-list"]/div[2]/div[1]/div[3]/div[2]/ul/li/div/div[3]')
                comment2 = driver.find_elements_by_xpath('//*[@id="review-list"]/div[2]/div[1]/div[3]/div[2]/ul/li/div/div[4]')
            else:
                pass
            comment_len1 = [len(k.text) for k in comment1]
            comment_len2 = [len(k.text) for k in comment2]
            try:
                #数据拼接成数据框
                y = pd.DataFrame({'usre_id':user_id,
                            'time':x['time'],
                            'comment_len1':comment_len1,
                            'comment_len2':comment_len2})
                y['mer_href'] = href[i]
 
############下面这个i一定要改成和上面起始值一样的,不然会报错
            if i == 0 &m==0:
                mer_comment_info_0 = y
            else:
                mer_comment_info_0 = pd.concat([mer_comment_info_0,y],axis = 0)
                mer_comment_info_0.to_csv('D:\\mer_comment_info156-667.csv')
                #没加入一页评论,输出一个字符,随时查看进度
                print(str(i)+'read'+str(m))   
            except:
                #如果发生错误不要停止程序,同时输出错误的页码
                print(str(i)+'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'+str(m))
                pass
                
        try:
            #翻页
            driver.find_element_by_link_text('下一页').click()
        except:
            #如果最后一页,进入下一个href
            break