selenium 公司评论

46qrfjad  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(133)

我的目标是搜集这家公司的所有评论。我试着操纵@Driftr95代码:

def extract(pg): 
    headers = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}
    url = f'https://www.glassdoor.com/Reviews/3M-Reviews-E446_P{pg}.htm?filter.iso3Language=eng'
    # f'https://www.glassdoor.com/Reviews/Google-Engineering-Reviews-EI_IE9079.0,6_DEPT1007_IP{pg}.htm?sort.sortType=RD&sort.ascending=false&filter.iso3Language=eng'

    r = requests.get(url, headers, timeout=(3.05, 27))
    soup = BeautifulSoup(r.content, 'html.parser')# this a soup function that retuen the whole html
    return soup

for j in range(1,21,10):
    for i in range(j+1,j+11,1): #3M: 4251 reviews
        soup = extract( f'https://www.glassdoor.com/Reviews/3M-Reviews-E446_P{i}.htm?filter.iso3Language=eng')
        print(f' page {i}')
        for r in soup.select('li[id^="empReview_"]'):
            rDet = {'reviewId': r.get('id')}
            for sr in r.select(subRatSel):
                k = sr.select_one('div:first-of-type').get_text(' ').strip()
                sval = getDECstars(sr.select_one('div:nth-of-type(2)'), soup)
                rDet[f'[rating] {k}'] = sval
    
            for k, sel in refDict.items():
                sval = r.select_one(sel)
                if sval: sval = sval.get_text(' ').strip()
                rDet[k] = sval
    
            empRevs.append(rDet)

在并非所有子评级始终可用的情况下,所有四个子评级结果将为N.A.。

wljmcqd8

wljmcqd81#

所有四个次级评级结果都是不适用的。
有一些事情我没有考虑到,因为我以前没有遇到过,但是updated version ofgetDECstars应该没有这个问题。(如果使用带有参数isv=True的较长版本,调试和找出代码中缺少的内容会更容易...)
我在这个案例中刮了200条评论,结果只有170条独特的评论
通过维护一个已经添加的reviewId的列表,并在向empRevs添加新评论之前对其进行检查,可以很容易地避免重复

scrapedIds = []
# for...
    # for ###
        # soup = extract...

        # for r in ...
            if r.get('id') in scrapedIds: continue # skip duplicate
            ## rDet = ..... ## AND REST OF INNER FOR-LOOP ##

            empRevs.append(rDet) 
            scrapedIds.append(rDet['reviewId']) # add to list of ids to check against

http往往在100轮后超时...
你可以尝试每50个请求增加一次break和switching out user-agents,但是在这种情况下我会很快使用selenium; this is my suggested solution-如果你只是这样调用它并传递一个url开始:

## PASTE [OR DOWNLOAD&IMPORT] from https://pastebin.com/RsFHWNnt ##

startUrl = 'https://www.glassdoor.com/Reviews/3M-Reviews-E446.htm?sort.sortType=RD&sort.ascending=false&filter.iso3Language=eng'
scrape_gdRevs(startUrl, 'empRevs_3M.csv', maxScrapes=1000, constBreak=False)

[last]打印输出第3行:

total reviews:  4252
total reviews scraped this run: 4252
total reviews scraped over all time: 4252

点击页面直到最后一页(或最大值maxScrapes)。不过,您必须在开始时登录,所以请在login_to_gd中填写您的用户名和密码,或手动登录,方法是将login_to_gd(driverG)行替换为input(...)行,等待您登录[然后在终端中按ENTER],然后继续。
我认为也可以使用cookie来代替(请求),但是我不擅长处理这个问题。如果你能理解,那么你可以使用linkToSoup的某个版本或者你的extract(pg);然后,您必须注解掉或删除以## for selenium结尾的行,并取消注解[或按照说明]以## without selenium结尾的行。[但请注意,我只对selenium版本进行了全面测试。]
CSV [如本例中的“empRevs_3M.csv”和“scrapeLogs_empRevs_3M.csv”]会在每次页面抓取后更新,因此即使程序崩溃[或您决定中断它],它也会保存到上一次抓取。由于它在开始时也会尝试从CSV加载,你可以稍后再继续(只要把startUrl设置为你想继续的页面的url--但是即使它在第1页,记住重复的内容会被忽略,所以没关系--尽管这只会浪费一些时间)。

相关问题