1,184

爬虫爬取网页评论详情

想爬取网页的所有评论,首先得找到评论分页的url规律,一般url跳转页数只会变化url中的某个固定的数量,如:

  https://www.test.com/product-reviews?ie=UTF8&reviewerType=all_reviews&pageNumber=1

当切换评论的页数时,唯一在变的只有最后面的pageNumber的值,且跟前端页面的页数有一定的数量关系,一般都是相等的,也有少数是不相等的,要找出其对应计算关系,因此,我们在爬取页面时,初始url可以传评论页面的首页。然后根据遍历递增pageNumber的数量值来爬取所有的评论详情。

这次只做了一个简单的爬取函数来爬取,首先得安装一些第三方插件,如:

  urllib3==1.24.1
  requests==2.20.0
  lxml==4.2.5

安装好以上的插件即可对网页的数据进行访问并读取,代码如下:

# -*- coding:utf-8 -*-
from urllib.parse import quote
import requests, string
import re, urllib.request, lxml.html
import csv
from config import BASE_PATH

# from app.depot.crawl_amazon_comment import *

def crawlComment():
    order_details = []
    for page in range(1, 512):
        print('抓取第'+str(page)+'页评论...')
        url ="https://www.test.com/product-reviews?ie=UTF8&reviewerType=all_reviews&pageNumber="+str(page)
        ##浏览器请求头用于模拟浏览器浏览页面,防止被禁爬
        headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
        opener = urllib.request.build_opener()
        opener.addheaders = [headers]
        ##页面编码,防止乱码
        data = opener.open(url).read().decode('utf-8','ignore')
        order_doc = lxml.html.document_fromstring(data)
        ##以下是一些Xpath的标签选择
        comments = order_doc.xpath('//div[@id="cm_cr-review_list"]/div[@id]')
        for data_list in comments:
            time =data_list.xpath('./div/span/text()')[0]
            ## contains(@class,"demo")是获取某标签中的class含有demo的所有子元素
            divs = data_list.xpath('./div/div[contains(@class,"demo")]')
            colors = divs[2].xpath('./a/text()')
            ##其中@加属性,就是获取属性值
            stars = divs[1].xpath('./a/@title')
            if len(colors):
                color_r = colors[1].split(': ')[1]
                ASIN = ASIN_dict[color_r]
                size_r = colors[0].split(': ')[1]
                comment_txt = divs[3].xpath('./span/text()')
                data_r = {'product': product, 'time':time, 'size': size_r, 'color': color_r, 'comment': comment_txt }
                order_details.append(data_r)
    
    path = BASE_PATH + "/app/static/media/downloadfiles/test-comments.csv"
    ##这里测试把抓取内容写入csv,写入数据库也一样,无非多个数据库连接插入
    with open(path, "w", encoding='utf-8-sig') as csvfile: 
        writer = csv.writer(csvfile)
        writer.writerow(["product","Size","Color",'date_time','comment'])
        for result in order_details:
            writer.writerows([[result['product'], result['size'], result['color'], result['time'], result['comment']]])
    # print(order_details)

    return '抓取结束'

由于对Xpath的不太熟悉,被整的头大,测试几次都未能读取到自己想要的内容,就各种上网找资料,万能的某度跟某歌,终于让我成功爬取想要的内容。

发表评论

邮箱地址不会被公开。 必填项已用*标注