سؤال

أريد الحصول على العديد من الصفحات من موقع ويب ، مثل

curl "http://farmsubsidy.org/DE/browse?page=[0000-3603]" -o "de.#1"

ولكن احصل على بيانات الصفحات في بيثون ، وليس ملفات القرص. هل يمكن لأي شخص أن ينشر pycurl رمز للقيام بذلك ،
أو سريع urllib2 (ليس في وقت واحد) إذا كان ذلك ممكنًا ،
أو قول "انسى ذلك ، حليقة أسرع وأكثر قوة"؟ شكرًا

هل كانت مفيدة؟

المحلول

هنا حل يعتمد على urllib2 والمواضيع.

import urllib2
from threading import Thread

BASE_URL = 'http://farmsubsidy.org/DE/browse?page='
NUM_RANGE = range(0000, 3603)
THREADS = 2

def main():
    for nums in split_seq(NUM_RANGE, THREADS):
        t = Spider(BASE_URL, nums)
        t.start()

def split_seq(seq, num_pieces):
    start = 0
    for i in xrange(num_pieces):
        stop = start + len(seq[i::num_pieces])
        yield seq[start:stop]
        start = stop

class Spider(Thread):
    def __init__(self, base_url, nums):
        Thread.__init__(self)
        self.base_url = base_url
        self.nums = nums
    def run(self):
        for num in self.nums:
            url = '%s%s' % (self.base_url, num)
            data = urllib2.urlopen(url).read()
            print data

if __name__ == '__main__':
    main()

نصائح أخرى

لذلك لديك مشكلة 2 واسمحوا لي أن أريكم في مثال واحد. لاحظ أن pycurl قام بالفعل بمتعدد الترابط/ليس في وقت واحد مع العمل الشاق الخاص بك.

#! /usr/bin/env python

import sys, select, time
import pycurl,StringIO

c1 = pycurl.Curl()
c2 = pycurl.Curl()
c3 = pycurl.Curl()
c1.setopt(c1.URL, "http://www.python.org")
c2.setopt(c2.URL, "http://curl.haxx.se")
c3.setopt(c3.URL, "http://slashdot.org")
s1 = StringIO.StringIO()
s2 = StringIO.StringIO()
s3 = StringIO.StringIO()
c1.setopt(c1.WRITEFUNCTION, s1.write)
c2.setopt(c2.WRITEFUNCTION, s2.write)
c3.setopt(c3.WRITEFUNCTION, s3.write)

m = pycurl.CurlMulti()
m.add_handle(c1)
m.add_handle(c2)
m.add_handle(c3)

# Number of seconds to wait for a timeout to happen
SELECT_TIMEOUT = 1.0

# Stir the state machine into action
while 1:
    ret, num_handles = m.perform()
    if ret != pycurl.E_CALL_MULTI_PERFORM:
        break

# Keep going until all the connections have terminated
while num_handles:
    # The select method uses fdset internally to determine which file descriptors
    # to check.
    m.select(SELECT_TIMEOUT)
    while 1:
        ret, num_handles = m.perform()
        if ret != pycurl.E_CALL_MULTI_PERFORM:
            break

# Cleanup
m.remove_handle(c3)
m.remove_handle(c2)
m.remove_handle(c1)
m.close()
c1.close()
c2.close()
c3.close()
print "http://www.python.org is ",s1.getvalue()
print "http://curl.haxx.se is ",s2.getvalue()
print "http://slashdot.org is ",s3.getvalue()

أخيرًا ، تعتمد هذه الكود بشكل أساسي على مثال على موقع pycurl =. =

قد تكون يجب عليك قراءة المستند حقًا. PPL قضاء وقت كبير على ذلك.

يمكنك فقط وضع ذلك في نص باش داخل حلقة.

ومع ذلك قد يكون لديك نجاح أفضل في تحليل كل صفحة باستخدام Python.http://www.securitytube.net/crawling-the-web-for-fun-and-profit-video.aspxستتمكن من الحصول على البيانات الدقيقة وحفظها في نفس الوقت في ديسيبل.http://www.securitytube.net/storing-mined-data-from-the-web-for-fun--profit-video.aspx

إذا كنت ترغب في الزحف إلى موقع ويب باستخدام Python ، فيجب أن تكون نظرة على Scrapy http://scrapy.org

استخدام جميل و الطلبات -

احصل على صفحة Head:

page = Soup(requests.get(url='http://rootpage.htm').text)

إنشاء مجموعة من الطلبات:

from requests import async

requests = [async.get(url.get('href')) for url in page('a')]
responses = async.map(requests)

[dosomething(response.text) for response in responses]

تتطلب الطلبات Gevent القيام بذلك راجع للشغل.

يمكنني أن أوصيك بمستخدم وحدة Async من المستخدم Human_Curl

انظر مثال:

from urlparse import urljoin 
from datetime import datetime

from human_curl.async import AsyncClient 
from human_curl.utils import stdout_debug

def success_callback(response, **kwargs):
    """This function call when response successed
    """
    print("success callback")
    print(response, response.request)
    print(response.headers)
    print(response.content)
    print(kwargs)

def fail_callback(request, opener, **kwargs):
    """Collect errors
    """
    print("fail callback")
    print(request, opener)
    print(kwargs)

with AsyncClient(success_callback=success_callback,
                 fail_callback=fail_callback) as async_client:
    for x in xrange(10000):
        async_client.get('http://google.com/', params=(("x", str(x)),)
        async_client.get('http://google.com/', params=(("x", str(x)),),
                        success_callback=success_callback, fail_callback=fail_callback)

الاستخدام بسيط جدا. ثم نجاح الصفحة المحملة من Async_client الفاشلة الاتصال بك. كما يمكنك تحديد الرقم على الاتصالات المتوازية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top