爬取天猫评论信息
必备知识
- 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¤tPage=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¤tPage='
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,按回车即可