使用python异步爬取淘宝大量商品的价格,并生成excel文件

一个很简单的爬虫,但是由于request库不支持协程,如果要爬取多个页面的商品,会耗费大量的时间在同步网页请求上,简直就是龟速。

但是呢,官方专门提供了一个aiohttp库,用来实现异步网页请求等功能,可以看作异步版的requests库,需要我们手动安装。命令行输入pip install aiohttp安装。

在编写代码之前,我们需要先获得user-agent和cookie。先打开浏览器访问淘宝网,然后按 f12 进入开发者模式,如果什么也没有就按 f5 刷新一下,
在这里插入图片描述
点击后,会看到cookie,再往下会看到user-agent。
在这里插入图片描述把他们复制下来,没有cookie和user-agent爬虫就无法爬取信息。

import aiohttp
import re
import asyncio
sem=asyncio.Semaphore(10)#信号量,控制协程数,防止爬的过快
header={
    
    "user-agent":"","Cookie":''}#header字典的value为刚刚复制的的user-agent和cookie

async def getExcel(url,header):
    async with sem:
        async with aiohttp.ClientSession() as session:
            async with session.request('GET',url,headers=header) as result:
                try:
                    info=[]#定义一个列表,用于存储商品名称和价格
                    text=await result.text()#异步获得页面信息
                    GoodsNames=re.findall(r'\"raw_title\"\:\".*?\"',text)#使用正则表达式获取页面的商品名
                    GoodsPrices=re.findall(r'\"view_price\"\:\"[\d\.]*\"',text)#使用正则表达式获取页面商品的价格
                    #将该页面的商品名称和价格保存到info列表中
                    for i in range(len(GoodsNames)):
                        try:
                            GoodsName=eval(GoodsNames[i].split(':')[1])
                            GoodsPrice=eval(GoodsPrices[i].split(':')[1])
                            info.append([GoodsName,GoodsPrice])
                        except:
                            info.append(['',''])
                except:
                    pass
                #将保存有商品信息的info列表写入csv文件,注意文件的打开模式一定要为'a',否则下一页面输入文件的新内容将覆盖本页面输入文件的内容。
                f=open('goods_info.csv','a',encoding='utf-8')
                for every in info:
                    f.write(','.join(every)+'\n')
        

def main(header):
    goods=input('请输入想检索的商品:')
    num=eval(input('请输入想检索的页面数:'))
    start_url='https://s.taobao.com/search?q=' + goods
    url_lst=[]
    #生成要爬取的多个页面的url列表
    for i in range(num):
        url_lst.append(start_url+'&s='+str(44*i)) 
    loop=asyncio.get_event_loop()#获取事件循环
    tasks=[getExcel(url,header) for url in url_lst]#生成任务列表
    loop.run_until_complete(asyncio.wait(tasks))#激活协程

if __name__=='__main__':
    main(header)          

注意:
1、写入文件时在f.open()里要用‘a’,如果用的是‘w’那么循环写入时旧的内容会被新写入的覆盖掉。
2、开头的header字典要添加进去user-agent和cookie的value,否则无法爬取任何信息。

编译执行,输入想要爬取的商品和 想要爬取多少页,运行。

请输入想检索的商品:羽绒服
请输入想检索的页面数:100

运行完毕会在.py文件的同一目录下生成一个csv文件,可以用excel打开。

只要短短十几秒,就可以爬取到几千个同类商品的价格,比单纯的request库效率不知道高了多少。如果有需要也可以增加功能,同时爬取销量、发货地点等信息。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44371305/article/details/105756815
今日推荐