scrapy 爬取天猫淘宝的某个商品评论

本文介绍了一种使用Python Scrapy框架爬取天猫商品评论数据的方法,并提供了完整的代码实现,包括数据解析、存储到MySQL数据库的过程。
这是商品的原url

https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.6.43a61af4WhDqVT&id=541017907539&skuId=3446836044419&user_id=2457021025&cat_id=2&is_b=1&rn=90d97cb796c8f4873e80f1f2c72990cd

这里写图片描述

用chrome打开url,然后clear一下,然后点击累计评论,下面就会出现一大堆加载的东西,一个一个找(我目前只知道一个一个点开看,但那些img什么的就别试了),然后你就看到了我图中蓝色的那段,那个就是评论的json数据,点开url是这样的,(推荐一个插件JSONView,可以方便看json数据),然后可以根据需要,爬取数据了

这里写图片描述

话不多说,先贴代码

tianmaopinlun.py

import scrapy
import json
from tianmaopinlun.items import TianmaopinlunItem

class tianmaopinlun(scrapy.Spider):
    name = 'tianmaopinlun'

    def start_requests(self):
        for i in range(1,11):
            yield scrapy.Request('https://rate.tmall.com/list_detail_rate.htm?itemId=541017907539&spuId=710352899&sellerId=2457021025&order=3&currentPage='+str(i)+'&append=0&content=1',callback=self.parse)

    def parse(self, response):
        res=str(response.body,"utf-8")
        res1=res[:-1]
        res2=res1.split("(",1)[1]
        #这里我对str的截取还不是很熟悉,所以采取了这种笨办法,有好方法的可以留言一下
        res3=json.loads(res2)
        for i in res3['rateDetail']['rateList']:
            items=TianmaopinlunItem()
            items['auctionSku']=i['auctionSku']
            items['rateContent']=i['rateContent']
            items['rateDate']=i['rateDate']
            if i['appendComment']:
                items['appendcontent']=i['appendComment']['content']
                items['appendcommentTime']=i['appendComment']['commentTime']
            else:
	            #本来一开始没有把空值设为0的,但后面考虑到要把数据写到mysql里去,还是这样写了
                items['appendcontent']='0'
                items['appendcommentTime']='0'
            yield items

item.py

import scrapy


class TianmaopinlunItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #下面的命名就是json数据里的命名(每次写代码最讨厌的就是命名了,emmm)
    auctionSku=scrapy.Field()
    rateContent=scrapy.Field()
    rateDate=scrapy.Field()
    appendcontent=scrapy.Field()
    appendcommentTime=scrapy.Field()

settings.py部分代码

ROBOTSTXT_OBEY = False
COOKIES_ENABLED=False
REDIRECT_ENABLED = True
MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'tianmaopinlun'         #数据库名字
MYSQL_USER = 'root'             #数据库账号
MYSQL_PASSWD = '111000'         #数据库密码

MYSQL_PORT = 3306

ITEM_PIPELINES = {
    'tianmaopinlun.pipelines.TianmaopinlunPipeline': 300,
   
}
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 50

pipelines.py

import pymysql

class TianmaopinlunPipeline(object):
    maorong_name = 'pinlun'
    #这里要先到mysql里去创建表,推荐Navicat for mysql 。当然你也可以在代码里创建
    maorong_insert="""
                        insert into pinlun(auctionSku,rateContent,rateDate,appendcontent,appendcommentTime)
                        values('{auctionSku}','{rateContent}','{rateDate}','{appendcontent}','{appendcommentTime}')
                    """

    def __init__(self,settings):
        self.settings=settings

    def process_item(self, item, spider):
        sqltext = self.maorong_insert.format(
            auctionSku=pymysql.escape_string(item['auctionSku']),
            rateContent=pymysql.escape_string(item['rateContent']),
            rateDate=pymysql.escape_string(item['rateDate']),
            appendcontent=pymysql.escape_string(item['appendcontent']),
            appendcommentTime=pymysql.escape_string(item['appendcommentTime']),
        )
        self.cursor.execute(sqltext)
        return item

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings)

    def open_spider(self, spider):
        # 连接数据库
        self.connect = pymysql.connect(
            host=self.settings.get('MYSQL_HOST'),
            port=self.settings.get('MYSQL_PORT'),
            db=self.settings.get('MYSQL_DBNAME'),
            user=self.settings.get('MYSQL_USER'),
            passwd=self.settings.get('MYSQL_PASSWD'),
            
            charset='utf8mb4',
            use_unicode=True)

        # 通过cursor执行增删查改
        self.cursor = self.connect.cursor();
        self.connect.autocommit(True)

    def close_spider(self, spider):
        self.cursor.close()
        self.connect.close()
可能数据写入会很缓慢,这是就需要异步写入了,这个我另一篇博客再写,应该会在爬xiciip的那篇写
如果在数据写入到mysql的时候,碰到了一些问题可以参考一下我这篇 https://blog.youkuaiyun.com/cotyyang/article/details/81713237
Scrapy中,爬取淘宝指定商品的评论通常涉及以下几个步骤: 1. **安装依赖**: 首先,确保已经安装了Scrapy和相关的中间件如`Scrapy-Splash`用于渲染JavaScript页面,以及`lxml`作为解析器。可以使用pip安装它们: ``` pip install scrapy scrapy-splash lxml ``` 2. **创建项目**: 使用命令行创建一个新的Scrapy项目: ```bash scrapy startproject taobao_comments ``` 3. **创建爬虫**: 进入项目目录,然后在spiders文件夹下创建一个名为`taobao_comment_spider.py`的文件,编写如下基础爬虫结构: ```python import scrapy class TaobaoCommentSpider(scrapy.Spider): name = "taobao_comment" allowed_domains = ["taobao.com"] start_urls = ['https://item.taobao.com/item.htm?id=<商品ID>'] # 将商品ID替换为你想爬取的实际ID def parse(self, response): # 解析评论区域的HTML结构,这需要分析实际网页的结构 comments = response.xpath('//div[@class="comment-content"]') # 假设评论在这样的节点下 for comment in comments: yield { 'author': comment.css('span.author::text').get(), 'content': comment.css('p.comment-text::text').get(), } # 如果存在分页或更多评论链接,可以在下面添加代码来处理 next_page = response.css('a.next')[0] if response.css('a.next').count() else None if next_page is not None: yield response.follow(next_page, self.parse) ``` 4. **启用中间件**: 在`settings.py`中启用Splash中间件,并配置其地址: ```python SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'my_project.middlewares.MyCustomDownloaderMiddleware': 800, } SPLASH_URL = 'http://localhost:8050/' # 根据你的环境配置 Splash 的运行地址 ``` 5. **启动爬虫**: 最后,在项目根目录运行 `scrapy crawl taobao_comment`。 注意:上述代码仅为示例,实际操作中你需要根据淘宝商品详情页的HTML结构调整XPath或CSS选择器。同时,频繁抓取淘宝数据可能会触发反爬机制,所以务必遵守使用规则并尊重网站的服务条款。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值