纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Python 爬虫文胸 Python实战爬虫之女友欲买文胸不知何色更美

Dream丶Killer   2021-09-30 我要评论
想了解Python实战爬虫之女友欲买文胸不知何色更美的相关内容吗Dream丶Killer在本文为您仔细讲解Python 爬虫文胸的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python,爬虫文胸,Python,网络爬虫下面大家一起来学习吧。

情景再现

今日天气尚好女友忽然欲买文胸但不知何色更美遂命吾剖析何色买者益众为点议事后而奖励之。

本文关键词

协程并发😊、IP被封😳、IP代理😏、代理被封😭、一种植物🌿

挑个“软柿子”

打开京东直接搜 【文胸】挑个评论最多的

进入详情页往下滑可以看到商品介绍啥的同时商品评价也在这里。

在这里插入图片描述

接下来重头戏F12 打开 开发者工具选择 Network然后点击全部评价抓取数据包。

请添加图片描述

将 url 打开发现确实是评论数据。

在这里插入图片描述

单页爬取

那我们先写个小 demo 来尝试爬取这页的代码看看有没有什么问题。

import requests
import pandas as pd

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36'
}

params = {
    'callback':'fetchJSON_comment98',
    'productId':'35152509650',
    'score':'0',
    'sortType':'6',
    'page': '5',
    'pageSize':'10',
    'isShadowSku':'0',
    'rid':'0',
    'fold':'1'
}

url = 'https://club.jd.com/comment/productPageComments.action?'
page_text = requests.get(url=url, headers=headers, params=params).text
page_text

在这里插入图片描述

数据处理

数据是获取了但前面多了一些没用的字符(后面也有)很明显不能直接转成 json 格式需要处理一下。

page_text = page_text[20: len(page_text) - 2]
data = json.loads(page_text)
data

在这里插入图片描述

现在数据格式处理好了可以上手解析数据提取我们所需要的部分。这里我们只提取 id(评论id)、color(产品颜色)、comment(评价)、time(评价时间)。

import pandas as pd

df = pd.DataFrame({'id': [],
                   'color': [],
                   'comment': [],
                   'time': []})
for info in data['comments']:
    df = df.append({'id': info['id'],
                    'color': info['productColor'],
                    'comment': info['content'],
                    'time': info['creationTime']},
                   ignore_index=True)
df

在这里插入图片描述

翻页操作

那么接下来就要寻找翻页的关键了下面用同样的方法获取第二页、第三页的url进行对比。

在这里插入图片描述

简单分析一下page 字段是页数翻页会用到值得注意的是 sortType字面意思是排序类型猜测排序方式可能是:热度、时间等。经过测试发现 sortType=5 肯定不是按时间排序的应该是热度我们要获取按时间排序的这样后期比较好处理然后试了几个值最后确定当 sortType=6 时是按评价时间排序。图中最后还有个 rid=0 不清楚什么作用我爬取两个相同的url(一个加 rid 一个不加)测试结果是相同的所以不用管它。

撸代码

先写爬取结果:开始想爬 10000 条评价结果请求过多IP凉了从IP池整了丶代理也没顶住拼死拼活整了1000条时间不够如果时间和IP充足随便爬。经过测试发现这个IP封锁时间不会超过一天第二天我跑了一下也有数据。下面看看主要的代码。

主调度函数

设置爬取的 url 列表windows 环境下记得限制并发量不然报错将爬取的任务添加到 tasks 中挂起任务。

async def main(loop):
    # 获取url列表
    page_list = list(range(0, 1000))
    # 限制并发量
    semaphore = asyncio.Semaphore(500)
    # 创建任务对象并添加到任务列表中
    tasks = [loop.create_task(get_page_text(page, semaphore)) for page in page_list]
    # 挂起任务列表
    await asyncio.wait(tasks)

页面抓取函数

抓取方法和上面讲述的基本一致只不过换成 aiohttp 进行请求对于SSL证书的验证也已设置。程序执行后直接进行解析保存。

async def get_page_text(page, semaphore):
    async with semaphore:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36'
        }
        params = {
            'callback': 'fetchJSON_comment98',
            'productId': '35152509650',
            'score': '0',
            'sortType': '6',
            'page': f'{page}',
            'pageSize': '10',
            'isShadowSku': '0',
            # 'rid': '0',
            'fold': '1'
        }
        url = 'https://club.jd.com/comment/productPageComments.action?'
        async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False), trust_env=True) as session:
            while True:
                try:
                    async with session.get(url=url, proxy='http://' + choice(proxy_list), headers=headers, params=params,
                                           timeout=4) as response:
                        # 遇到IO请求挂起当前任务等IO操作完成执行之后的代码当协程挂起时事件循环可以去执行其他任务。
                        page_text = await response.text()
                        # 未成功获取数据时更换ip继续请求
                        if response.status != 200:
                            continue
                        print(f"第{page}页爬取完成!")
                        break
                except Exception as e:
                    print(e)
                    # 捕获异常继续请求
                    continue
        return parse_page_text(page_text)

解析保存函数

将 json 数据解析以追加的形式保存到 csv 中。

def parse_page_text(page_text):
    page_text = page_text[20: len(page_text) - 2]
    data = json.loads(page_text)

    df = pd.DataFrame({'id': [],
                       'color': [],
                       'comment': [],
                       'time': []})
    for info in data['comments']:
        df = df.append({'id': info['id'],
                        'color': info['productColor'],
                        'comment': info['content'],
                        'time': info['creationTime']},
                       ignore_index=True)

    header = False if Path.exists(Path('评价信息.csv')) else True
    df.to_csv('评价信息.csv', index=False, mode='a', header=header)
    print('已保存')

可视化

颜色分布

排名前三分别是灰粉色、黑色、裸感肤色多的不说自己体会哈。

在这里插入图片描述

评价词云图

可以看出评价的关键词大多是对上身感觉的一些描述穿着舒服当然是第一位的~

在这里插入图片描述

完结撒花该向女朋友汇报工作了~

别忘记收藏哦~

在这里插入图片描述


相关文章

猜您喜欢

网友评论

Copyright 2020 www.Shellfishsoft.com 【贝软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式