首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加速图像网络刮刀

加速图像网络刮刀
EN

Stack Overflow用户
提问于 2018-03-16 13:38:50
回答 1查看 127关注 0票数 2

我写了我的第一个网络刮刀,这(令人惊讶)完成了这项工作。我正在为图片抓取一个流行的漫画网站 (它们的900上有),但问题是刮板太慢了。

例如,如果我下载了一个10漫画示例,那么每个图像平均需要一个45 secs (该示例总共需要> 40 secs ),如果您问我,这有点太慢了,因为每个图像都差不多。80KB800KB的大小。

我已经读过,我可以切换到lxml来异步地进行抓取,但是这个包与Python3.6不兼容。

我试过这个:

代码语言:javascript
运行
复制
pip3 install lxml

只是为了得到这个:

代码语言:javascript
运行
复制
Could not find a version that satisfies the requirement python-lxml (from versions: )
No matching distribution found for python-lxml

所以我的问题是如何加速刮板?

也许该怪我的刮擦逻辑?最后,是否有办法只为相关部分刮网页?

这是密码。我删除了所有的眼糖果和输入验证-完整的代码这里

代码语言:javascript
运行
复制
import re
import time
import requests
import itertools
from requests import get
from bs4 import BeautifulSoup as bs

def generate_comic_link(array, num):
  for link in itertools.islice(array, 0, num):
    yield link

def grab_image_src_url(link):
  req = requests.get(link)
  comic = req.text
  soup = bs(comic, 'html.parser')
  for i in soup.find_all('p'):
    for img in i.find_all('img', src=True):
      return img['src']

def download_image(link):
  file_name = url.split('/')[-1]
  with open(file_name, "wb") as file:
    response = get(url)
    file.write(response.content)

def fetch_comic_archive():
  url = 'http://www.poorlydrawnlines.com/archive/'
  req = requests.get(url)
  page = req.text
  soup = bs(page, 'html.parser')
  all_links = []
  for link in soup.find_all('a'):
    all_links.append(link.get('href'))
  return all_links

def filter_comic_archive(archive):
  pattern = re.compile(r'http://www.poorlydrawnlines.com/comic/.+')
  filtered_links = [i for i in archive if pattern.match(i)]
  return filtered_links

all_comics = fetch_comic_archive()
found_comics = filter_comic_archive(all_comics)

print("\nThe scraper has found {} comics.".format(len(found_comics)))
print("How many comics do you want to download?")
n_of_comics = int(input(">> ").strip())

start = time.time()
for link in generate_comic_link(found_comics, n_of_comics):
  print("Downloading: {}".format(link)
  url = grab_image_src_url(link)
  download_image(url)
end = time.time()
print("Successfully downloaded {} comics in {:.2f} seconds.".format(n_of_comics, end - start))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-18 21:39:30

解决方案是导入threading。为了使用与问题中相同的代码,下面是解决方案:

代码语言:javascript
运行
复制
...
for link in generate_comic_link(found_comics, n_of_comics):
  print("Downloading: {}".format(link))
  url = grab_image_src_url(link)
  thread = threading.Thread(target=download_image, args=(url,))
  thread.start()
thread.join()
...

这实际上降低了几乎50%的下载速度,甚至对于上面所示的粗糙代码也是如此。

与以前的10秒相比,10图像示例的下载时间现在大约为21秒。

完全重构的代码是这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49322145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档