الحصول على العديد من الصفحات مع pycurl؟
سؤال
أريد الحصول على العديد من الصفحات من موقع ويب ، مثل
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 الفاشلة الاتصال بك. كما يمكنك تحديد الرقم على الاتصالات المتوازية.