Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 1010527
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 16, 20262026-05-16T09:05:46+00:00 2026-05-16T09:05:46+00:00

I have a script that fetches several web pages and parses the info. (An

  • 0

I have a script that fetches several web pages and parses the info.

(An example can be seen at http://bluedevilbooks.com/search/?DEPT=MATH&CLASS=103&SEC=01 )

I ran cProfile on it, and as I assumed, urlopen takes up a lot of time. Is there a way to fetch the pages faster? Or a way to fetch several pages at once? I’ll do whatever is simplest, as I’m new to python and web developing.

Thanks in advance! 🙂

UPDATE: I have a function called fetchURLs(), which I use to make an array of the URLs I need
so something like urls = fetchURLS().The URLS are all XML files from Amazon and eBay APIs (which confuses me as to why it takes so long to load, maybe my webhost is slow?)

What I need to do is load each URL, read each page, and send that data to another part of the script which will parse and display the data.

Note that I can’t do the latter part until ALL of the pages have been fetched, that’s what my issue is.

Also, my host limits me to 25 processes at a time, I believe, so whatever is easiest on the server would be nice 🙂


Here it is for time:

Sun Aug 15 20:51:22 2010    prof

         211352 function calls (209292 primitive calls) in 22.254 CPU seconds

   Ordered by: internal time
   List reduced from 404 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       10   18.056    1.806   18.056    1.806 {_socket.getaddrinfo}
     4991    2.730    0.001    2.730    0.001 {method 'recv' of '_socket.socket' objects}
       10    0.490    0.049    0.490    0.049 {method 'connect' of '_socket.socket' objects}
     2415    0.079    0.000    0.079    0.000 {method 'translate' of 'unicode' objects}
       12    0.061    0.005    0.745    0.062 /usr/local/lib/python2.6/HTMLParser.py:132(goahead)
     3428    0.060    0.000    0.202    0.000 /usr/local/lib/python2.6/site-packages/BeautifulSoup.py:1306(endData)
     1698    0.055    0.000    0.068    0.000 /usr/local/lib/python2.6/site-packages/BeautifulSoup.py:1351(_smartPop)
     4125    0.053    0.000    0.056    0.000 /usr/local/lib/python2.6/site-packages/BeautifulSoup.py:118(setup)
     1698    0.042    0.000    0.358    0.000 /usr/local/lib/python2.6/HTMLParser.py:224(parse_starttag)
     1698    0.042    0.000    0.275    0.000 /usr/local/lib/python2.6/site-packages/BeautifulSoup.py:1397(unknown_starttag)
  • 1 1 Answer
  • 2 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-16T09:05:47+00:00Added an answer on May 16, 2026 at 9:05 am

    EDIT: I’m expanding the answer to include a more polished example. I have found a lot hostility and misinformation in this post regarding threading v.s. async I/O. Therefore I also adding more argument to refute certain invalid claim. I hope this will help people to choose the right tool for the right job.

    This is a dup to a question 3 days ago.

    Python urllib2.open is slow, need a better way to read several urls – Stack Overflow
    Python urllib2.urlopen() is slow, need a better way to read several urls

    I’m polishing the code to show how to fetch multiple webpage in parallel using threads.

    import time
    import threading
    import Queue
    
    # utility - spawn a thread to execute target for each args
    def run_parallel_in_threads(target, args_list):
        result = Queue.Queue()
        # wrapper to collect return value in a Queue
        def task_wrapper(*args):
            result.put(target(*args))
        threads = [threading.Thread(target=task_wrapper, args=args) for args in args_list]
        for t in threads:
            t.start()
        for t in threads:
            t.join()
        return result
    
    def dummy_task(n):
        for i in xrange(n):
            time.sleep(0.1)
        return n
    
    # below is the application code
    urls = [
        ('http://www.google.com/',),
        ('http://www.lycos.com/',),
        ('http://www.bing.com/',),
        ('http://www.altavista.com/',),
        ('http://achewood.com/',),
    ]
    
    def fetch(url):
        return urllib2.urlopen(url).read()
    
    run_parallel_in_threads(fetch, urls)
    

    As you can see, the application specific code has only 3 lines, which can be collapsed into 1 line if you are aggressive. I don’t think anyone can justify their claim that this is complex and unmaintainable.

    Unfortunately most other threading code posted here has some flaws. Many of them do active polling to wait for the code to finish. join() is a better way to synchronize the code. I think this code has improved upon all the threading examples so far.

    keep-alive connection

    WoLpH’s suggestion about using keep-alive connection could be very useful if all you URLs are pointing to the same server.

    twisted

    Aaron Gallagher is a fans of twisted framework and he is hostile any people who suggest thread. Unfortunately a lot of his claims are misinformation. For example he said “-1 for suggesting threads. This is IO-bound; threads are useless here.” This contrary to evidence as both Nick T and I have demonstrated speed gain from the using thread. In fact I/O bound application has the most to gain from using Python’s thread (v.s. no gain in CPU bound application). Aaron’s misguided criticism on thread shows he is rather confused about parallel programming in general.

    Right tool for the right job

    I’m well aware of the issues pertain to parallel programming using threads, python, async I/O and so on. Each tool has their pros and cons. For each situation there is an appropriate tool. I’m not against twisted (though I have not deployed one myself). But I don’t believe we can flat out say that thread is BAD and twisted is GOOD in all situations.

    For example, if the OP’s requirement is to fetch 10,000 website in parallel, async I/O will be prefereable. Threading won’t be appropriable (unless maybe with stackless Python).

    Aaron’s opposition to threads are mostly generalizations. He fail to recognize that this is a trivial parallelization task. Each task is independent and do not share resources. So most of his attack do not apply.

    Given my code has no external dependency, I’ll call it right tool for the right job.

    Performance

    I think most people would agree that performance of this task is largely depend on the networking code and the external server, where the performance of platform code should have negligible effect. However Aaron’s benchmark show an 50% speed gain over the threaded code. I think it is necessary to response to this apparent speed gain.

    In Nick’s code, there is an obvious flaw that caused the inefficiency. But how do you explain the 233ms speed gain over my code? I think even twisted fans will refrain from jumping into conclusion to attribute this to the efficiency of twisted. There are, after all, a huge amount of variable outside of the system code, like the remote server’s performance, network, caching, and difference implementation between urllib2 and twisted web client and so on.

    Just to make sure Python’s threading will not incur a huge amount of inefficiency, I do a quick benchmark to spawn 5 threads and then 500 threads. I am quite comfortable to say the overhead of spawning 5 thread is negligible and cannot explain the 233ms speed difference.

    In [274]: %time run_parallel_in_threads(dummy_task, [(0,)]*5)
    CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
    Wall time: 0.00 s
    Out[275]: <Queue.Queue instance at 0x038B2878>
    
    In [276]: %time run_parallel_in_threads(dummy_task, [(0,)]*500)
    CPU times: user 0.16 s, sys: 0.00 s, total: 0.16 s
    Wall time: 0.16 s
    
    In [278]: %time run_parallel_in_threads(dummy_task, [(10,)]*500)
    CPU times: user 1.13 s, sys: 0.00 s, total: 1.13 s
    Wall time: 1.13 s       <<<<<<<< This means 0.13s of overhead
    

    Further testing on my parallel fetching shows a huge variability in the response time in 17 runs. (Unfortunately I don’t have twisted to verify Aaron’s code).

    0.75 s
    0.38 s
    0.59 s
    0.38 s
    0.62 s
    1.50 s
    0.49 s
    0.36 s
    0.95 s
    0.43 s
    0.61 s
    0.81 s
    0.46 s
    1.21 s
    2.87 s
    1.04 s
    1.72 s
    

    My testing does not support Aaron’s conclusion that threading is consistently slower than async I/O by a measurable margin. Given the number of variables involved, I have to say this is not a valid test to measure the systematic performance difference between async I/O and threading.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a script that parses IIS logs and at the moment it fetches
I have a small cgi script that fetches and validates a configuration file for
I have a Python script that for-loops through some objects and fetches data from
I have a Perl script I wrote for my own personal use that fetches
I have a PHP script (fetchData.php) that fetches some data and outputs it to
I have a python script that connects to an external host, fetches some data,
I have a php script that can take anything from 2 to 10 minutes
I have one go script that fetches any other script requested and this is
I have a php script that fetches data from a DB, the result set
I have a PHP script that fetches an image from a remote server so

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.