从接触爬虫以来,一直都认为爬虫是一个很简单的东西,至从写了一个从虎扑论坛下载图片的简单爬虫后就一直没有进行研究。昨天闲来无事就学习爬虫淘宝商品信息结果发现有些困难,就想发个帖子,至少让我走过的弯路不让别人走吧
在编写过程中遇到了几个难点,如果觉得遇到问题相同可以参考,不同就不浪费大家时间了。
1.和爬取虎扑论坛图片不同,爬取图片十分简单,只要在界面中就可以直接获取到图片下载的地址,而淘宝商品评论不同,是通过Ajax(好像是,后续有时间我会调查清楚,重新编辑)请求后得到的,我理解就是这个评论需要你点一下,而不是直接肉眼就能看到
2.访问淘宝商铺连接,十分恶心。一直返问的是一个登录连接,而不是我想要的html内容,加上header,或者用webdriver都不好用,后来才想到可能是我的header里没有账号密码信息,后来添加上cookie,才搞定
3.我本意是想写到CSV文件中,万一以后可以用到就不需要再爬取了,结果商品评论中会有?这种可爱的表情,写到时候就一点不可爱,导致一直报 ‘UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\U0001f604’ in position 12: illegal multibyte sequence’,后来明白原来是编码格式问题,调查后对编码格式也进一步了解
4.在测试过程中,由于一直调试会一直对页面发送请求,请求次数过多过频繁,淘宝就会弹出一个拖拽验证码,我又不想入新坑,就导致我调试一会休息一会,效率低下。
5.废话不说,还是直接代码吧,注释很多,不理解的可以私下探讨
#爬取淘宝商品信息,真的恶心,搞了一天
import requests
import simplejson
import json
import csv
import time
base_url ='https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&spuId=279689783&sellerId=92889104&order=3&callback=jsonp698'
header = {'Connection': 'keep-alive',
'Cookie':此处写你自己浏览器的cookie'}
for i in range(1,20,1):
url = base_url + '¤tPage=%s'% str(i)
# 将响应内容的文本取出
tb_req = requests.get(url, headers=header).text[11:-1]
#print(tb_req)
#将str格式的文本格式化为字典
print(tb_req)
tb_dict = simplejson.loads(tb_req)
#编码: 将字典内容转化为json格式对象
tb_json = json.dumps(tb_dict, indent=2) #indent参数为缩紧,这样打印出来是树形json结构,方便直观
#解码: 将json格式字符串转化为python对象
review_j = json.loads(tb_json)
for p in range(0, 19, 1):
with open(r'./tao_data.csv','a',encoding = 'gb18030',newline='') as csvfile:
#encoding = 'gb18030' 解决表情写入csv报错,但写入CSV后会别成???不影响观看就无视掉了
writer = csv.writer(csvfile)
output = [review_j["rateDetail"]["rateList"][p]['rateContent'].encode('utf-8').decode('utf-8')]
writer.writerow(output)
time.sleep(1)
print('Done!')