皮皮辉的爬虫学习之路

爬取天猫评论信息

必备知识

  • URL(Uniform / Universal Resource Locator):统一资源定位符,完整地描述Internet上网页和其他资源的地址的一种标识方法。
  • Host:用于指定,请求资源的主机IP和端口号,其内容为请求url的原始服务器或网关的位置,从HTTP1.1版本开始,请求必须包含此内容。
  • Cookies:维持当前访问会话,服务器通过Cookies识别出我们自己,并且查出当前状态时登录状态,所以返回结果就是登录之后才能看到的网页内容。
  • Referer:此内容用来标识这个请求是哪个页面发过来的。
  • User-Agent:可以使服务器识别客户使用的操作系统及版本、浏览器及版本信息,在做爬虫是加上此信息,可以伪装为浏览器,如果不加,很可能会被识别出为爬虫
  • Content-Type:互联网媒体类型,例如,text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型。

爬取天猫商品评论的过程

  • 首先我们找到需要爬取的商品评论
    皮皮辉的爬虫学习之路
  • 然后进入网页的检查页面,我这里使用的浏览器是chrome73版本的,只需要右键然后选择检查即可
  • 再然后我们为了爬取多页的评论,我们这个时候就要找到当我们点击下一页的时候,系统会调取的页面,然后在那里面我们就能找到我们需要的信息,然后根据我们所需要的信息进行正则的匹配,写爬虫程序即可。
  • 如下图 这里我们能看到url皮皮辉的爬虫学习之路
  • 而在这里我们嫩=能得到Referer和User-Agent
    皮皮辉的爬虫学习之路
  • 然后我们找到network中出现的list-detail,在这里面就有我们所需要的爬取信息了
    皮皮辉的爬虫学习之路
  • 最后直接上代码了,各个部分也写了注解
# 导入需要的库
import requests
import json
import re

# 宏变量存储目标js的URL列表
COMMENT_PAGE_URL = []


# 生成链接列表
def Get_Url(num):
    COMMENT_PAGE_URL.clear()
    # urlFront ='https://rate.tmall.com/list_detail_rate.htm?itemId=591204720926&spuId=1196687088&sellerId=2057500938&order=3&currentPage=2&append=0&content=1&tagId=&posi=&picture=&groupId=&ua=098%23E1hvpvvfvw6vUvCkvvvvvjiPn2Fvzji2R2SWtj3mPmPwtjl8P2zZzj1PP2MhsjEhdphvmpvZ8vi3OppjoUhCvvswN8iy0YMwzPAQ6DItvpvhvvvvvUhCvvswPv1yMKMwzPQphHurvpvEvCo5vVYSCHDDdphvmQ9ZCQmj3QBBn4hARphvCvvvvvmrvpvEvvQRvy3UvRoi2QhvCvvvMMGCvpvVvvpvvhCvmphvLv99ApvjwYcEKOms5k9vibmXYC97W3dhA8oQrEtlB%2BFy%2BnezrmphQRAn3feAOHFIAXcBKFyK2ixrsj7J%2B3%2BdafmxfBkKNB3rsj7Q%2Bu0ivpvUvvmvRE8X69TEvpvVmvvC9jahKphv8vvvvvCvpvvvvvmm86CvmWZvvUUdphvWvvvv9krvpv3Fvvmm86CvmVWtvpvhvvvvv8wCvvpvvUmm3QhvCvvhvvmrvpvEvvFyvrzavm9VdphvhCQpVUCZxvvC7g0znsBBKaVCvpvLSH1a7z2SznswEjE4GDRi4IkisIhCvvswN8340nMwzPs5OHItvpvhvvvvv86Cvvyvh2%2BHj1GhPDervpvEvv1LCNL6Chi19phvHNlwM7L7qYswM22v7SEL4OVUTGqWgIhCvvswN83KTRMwzPQZ9DuCvpvZz2AufpfNznsGDnrfY%2FjwZr197Ih%3D&needFold=0&_ksTS=1584072063659_1149&callback=jsonp1150'
    urlFront = 'https://rate.tmall.com/list_detail_rate.htm?itemId=591204720926&spuId=1196687088&sellerId=2057500938&order=3&currentPage='
    urlRear ='&append=0&content=1&tagId=&posi=&picture=&groupId=&ua=098%23E1hvpvvfvw6vUvCkvvvvvjiPn2Fvzji2R2SWtj3mPmPwtjl8P2zZzj1PP2MhsjEhdphvmpvZ8vi3OppjoUhCvvswN8iy0YMwzPAQ6DItvpvhvvvvvUhCvvswPv1yMKMwzPQphHurvpvEvCo5vVYSCHDDdphvmQ9ZCQmj3QBBn4hARphvCvvvvvmrvpvEvvQRvy3UvRoi2QhvCvvvMMGCvpvVvvpvvhCvmphvLv99ApvjwYcEKOms5k9vibmXYC97W3dhA8oQrEtlB%2BFy%2BnezrmphQRAn3feAOHFIAXcBKFyK2ixrsj7J%2B3%2BdafmxfBkKNB3rsj7Q%2Bu0ivpvUvvmvRE8X69TEvpvVmvvC9jahKphv8vvvvvCvpvvvvvmm86CvmWZvvUUdphvWvvvv9krvpv3Fvvmm86CvmVWtvpvhvvvvv8wCvvpvvUmm3QhvCvvhvvmrvpvEvvFyvrzavm9VdphvhCQpVUCZxvvC7g0znsBBKaVCvpvLSH1a7z2SznswEjE4GDRi4IkisIhCvvswN8340nMwzPs5OHItvpvhvvvvv86Cvvyvh2%2BHj1GhPDervpvEvv1LCNL6Chi19phvHNlwM7L7qYswM22v7SEL4OVUTGqWgIhCvvswN83KTRMwzPQZ9DuCvpvZz2AufpfNznsGDnrfY%2FjwZr197Ih%3D&needFold=0&_ksTS=1584072063659_1149&callback=jsonp1150'
    for i in range(0, num):
        COMMENT_PAGE_URL.append(urlFront + str(1 + i) + urlRear)


# 获取评论数据
def GetInfo(num):
    # 定义需要的字段
    nickname = []
    auctionSku = []
    ratecontent = []
    ratedate = []
    # 循环获取每一页评论
    for i in range(num):
        # 头文件,没有头文件会返回错误的js
        headers = {
            'cookie':'cna=AZIzFWjRuyICAToTAygn5OEJ; sm4=429006; hng=CN%7Czh-CN%7CCNY%7C156; lid=%E6%98%9F%E8%BE%89%E7%81%BF%E7%83%82%E4%B9%8B%E7%82%8E%E7%84%B1%E7%87%9A; t=1e17c56d1530f801b4c5dd9bc8793aa2; tracknick=%5Cu6',
            'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
            'referer': 'https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.3d067a51ue6QgE&id=591204720926&skuId=4065121357065&areaId=420100&user_id=2057500938&cat_id=50025174&is_b=1&rn=f3dfc9236475de95757ce169d42558a0',
            'accept': '*/*',
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-CN,zh;q=0.9'
        }#伪装成浏览器访问,防止乱码或者防止访问失败
        # 解析JS文件内容
        print(COMMENT_PAGE_URL[i])
        content = requests.get(COMMENT_PAGE_URL[i], headers=headers).text  # 调用http接口并获取他的文字
        print(content)
        # nk = re.findall('"displayUserNick":"(.*?)"', content)
        # nickname.extend(nk)
        # # print(nk)
        #如果不需要某些信息,删除对应部分即可,要添加某些信息,照着样子写新的正则即可
        nickname.extend(re.findall('"displayUserNick":"(.*?)"', content))  # 正则表达式匹配存入列表
        auctionSku.extend(re.findall('"auctionSku":"(.*?)"', content))
        ratecontent.extend(re.findall('"rateContent":"(.*?)"', content))
        ratedate.extend(re.findall('"rateDate":"(.*?)"', content))
    # 将数据写入TEXT文件中
    for i in list(range(0, len(nickname))):
        text = ','.join((nickname[i], ratedate[i], auctionSku[i], ratecontent[i])) + '\n'
        with open(r"D:\\python\\python\\taobao_info\\TaoBao.txt", 'a+', encoding='UTF-8') as file:
            file.write(text + ' ')
            print(i + 1, ":写入成功")


# 主函数
if __name__ == "__main__":
    Page_Num = 20
    Get_Url(Page_Num)
    GetInfo(10)

  • 这里是用的我登录之后的cookie,所以大家在使用的时候用自己的cookie替换即可。
  • cookie的查看方式有很多种,这里说一下我的做法:在控制台输入document.cookie,按回车即可
    皮皮辉的爬虫学习之路
上一篇:通过ReRes让chrome拥有路径映射的autoResponse功能。


下一篇:python笔记26