为什么我的简单python网络爬虫运行得非常慢?

为什么我的简单python网络爬虫运行得非常慢?,python,python-requests,web-crawler,Python,Python Requests,Web Crawler,我正在努力拼凑大约34000页。我计算了时间,发现请求每个页面平均需要5秒以上。因为我直接从API中抓取数据,所以我只使用了requests包。有没有什么方法可以让我的爬虫加速?或者,如果不可能,如何将爬虫部署到服务器 以下是我的一些代码: # Using python selenium to scrape sellers on shopee.co.id # Crawl one seller -> Crawl all sellers in the list # Sample URL: ht

我正在努力拼凑大约34000页。我计算了时间,发现请求每个页面平均需要5秒以上。因为我直接从API中抓取数据,所以我只使用了requests包。有没有什么方法可以让我的爬虫加速?或者,如果不可能,如何将爬虫部署到服务器

以下是我的一些代码:

# Using python selenium to scrape sellers on shopee.co.id
# Crawl one seller -> Crawl all sellers in the list
# Sample URL: https://shopee.co.id/shop/38281755/search
# Sample API: https://shopee.co.id/api/v2/shop/get?shopid=38281755
import pandas as pd
import requests
import json
from datetime import datetime
import time

PATH_1 = '/Users/lixiangyi/FirstIntern/temp/seller_list.csv'
shop_list = pd.read_csv(PATH_1)
shop_ids = shop_list['shop'].tolist()
# print(seller_list)

# Downloading all APIs of shopee sellers:
api_links = []  # APIs of shops
item_links = []  # Links to click into
for shop_id in shop_ids:
    api_links.append('https://shopee.co.id/api/v2/shop/get?shopid=' + str(shop_id))
    item_links.append(
        f'https://shopee.co.id/api/v2/search_items/?by=pop&limit=10&match_id={shop_id}&newest=0&order=desc&page_type=shop&version=2'
    )
# print(api_links)


shop_names = []
shopid_list = []
founded_time = []
descriptions = []
i = 1

for api_link in api_links[0:100]:
    start_time = time.time()
    shop_info = requests.get(api_link)
    shopid_list.append(shop_info.text)
    print(i)
    i += 1
    end_time = time.time()
    print(end_time - start_time)


使用python
urllib

import urllib.request 
request_url = urllib.request.urlopen(some-url) 
print(request_url.read()) 

使用python
urllib

import urllib.request 
request_url = urllib.request.urlopen(some-url) 
print(request_url.read()) 

您应该尝试使用线程或
aiohttp
包并行检索多个URL。使用线程:

更新

由于您的所有请求都是针对同一个网站的,因此使用对象进行检索将更加有效。但是,无论您如何检索这些URL,在短时间内从同一IP地址向同一网站发出过多请求都可能被解释为拒绝服务攻击

导入请求
从concurrent.futures导入ThreadPoolExecutor
从functools导入部分
导入时间
api_links=[]。#这将被填写
headers={'user-agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/84.0.4147.105 Safari/537.36'}
shopid_列表=[]
def检索url(会话,url):
shop_info=session.get(url)
退货商店信息.text
NUM_THREADS=75#使用此值进行实验
使用ThreadPoolExecutor(最大工作线程数=NUM线程数)作为执行器:
将requests.Session()作为会话:
session.headers=标题
#会话将是检索url的第一个参数:
工作者=部分(检索url,会话)
开始时间=time.time()
对于executor.map中的结果(工作者、api_链接):
shopid_list.append(结果)
结束时间=time.time()
打印(结束时间-开始时间)

您应该尝试使用线程或
aiohttp
包并行检索多个URL。使用线程:

更新

由于您的所有请求都是针对同一个网站的,因此使用对象进行检索将更加有效。但是,无论您如何检索这些URL,在短时间内从同一IP地址向同一网站发出过多请求都可能被解释为拒绝服务攻击

导入请求
从concurrent.futures导入ThreadPoolExecutor
从functools导入部分
导入时间
api_links=[]。#这将被填写
headers={'user-agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/84.0.4147.105 Safari/537.36'}
shopid_列表=[]
def检索url(会话,url):
shop_info=session.get(url)
退货商店信息.text
NUM_THREADS=75#使用此值进行实验
使用ThreadPoolExecutor(最大工作线程数=NUM线程数)作为执行器:
将requests.Session()作为会话:
session.headers=标题
#会话将是检索url的第一个参数:
工作者=部分(检索url,会话)
开始时间=time.time()
对于executor.map中的结果(工作者、api_链接):
shopid_list.append(结果)
结束时间=time.time()
打印(结束时间-开始时间)

可能是API的费率有限,在这种情况下,您可能无能为力(除了支付他们,如果他们提供更高质量的付费服务)。虽然它可能有助于找到一种方法,用更少的API调用来获取所需的信息。但它有可能提高您的刮取速度。然而,由于您的目标是一个站点,因此提高您的速度很可能会阻止您的IP地址,这是理所当然的。某些刮取速度非常快,以至于您在目标上有效地执行拒绝服务攻击,从而损害所有者和其他用户的利益。这可能是因为API的速率有限,在这种情况下,您可能无能为力(如果他们提供更高质量的付费服务,您可以向他们付费)。虽然它可能有助于找到一种方法,用更少的API调用来获取所需的信息。但它有可能提高您的刮取速度。然而,由于您的目标是一个站点,因此提高您的速度很可能会阻止您的IP地址,这是理所当然的。某些刮取速度非常快,您可以有效地对目标执行拒绝服务攻击,对所有者和其他用户不利。我发现
请求
运行速度与Python自己的文档推荐的速度一样快。我发现
请求
运行速度与Python自己的文档推荐的速度一样快。