一个很简单的爬虫,但是由于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库效率不知道高了多少。如果有需要也可以增加功能,同时爬取销量、发货地点等信息。