membagi permintaan urllib2/beautifulsoup menjadi paket permintaan yang lebih kecil

Saya ingin mengumpulkan satu set ID paten tentang istilah pencarian 'mobil'. Saya menulis kode ini:

import urllib2
from bs4 import BeautifulSoup
import sys
import StringIO
import re


search_term = 'automobile'
patent_list = []
for i in range(100): #for the first 100 pages of results
    web_page = 'https://www.lens.org/lens/search?q=' + str(search_term) + '&sat=P&l=en&st=true&p=' + str(i) + '&n=100'
    page = urllib2.urlopen(web_page)
    soup = BeautifulSoup(page,'html.parser')

    for aref in soup.findAll("a",href=True):
        if re.findall('/lens/patent',aref['href']):
            link = aref['href']
            split_link = link.split('/')
            if len(split_link) == 4:
                patent_list.append(split_link[-1])

print '\n'.join(set(patent_list))

Namun, saya mendapat kesalahan 503. Saya mencari ini di Google dan menemukannya: '

Server saat ini tidak dapat menangani permintaan karena kelebihan beban sementara atau pemeliharaan server.'

Apakah ini berarti

  1. Jangan gunakan algoritme, susun ID secara manual atau
  2. Bagi permintaan menjadi bagian-bagian yang lebih kecil.

Jika jawabannya adalah (2), bagaimana cara membaginya menjadi permintaan yang lebih kecil?


person Slowat_Kela    schedule 20.04.2018    source sumber
comment
Artinya ada yang tidak beres pada permintaan yang Anda posting dan cara server memprosesnya jadi bukan 1 atau 2.   -  person Alper    schedule 20.04.2018


Jawaban (1)


Apakah ini berarti (1) Jangan gunakan algoritme, melainkan susun ID secara manual atau (2) Bagi permintaan menjadi beberapa bagian yang lebih kecil.

Juga tidak.

  1. Saya tidak mengerti algoritma apa yang Anda bicarakan, tapi tidak.
  2. Saya juga tidak yakin apa yang Anda maksud dengan "potongan kecil", tapi sekali lagi tidak.

503 pada dasarnya berarti server terlalu sibuk atau terkadang offline.

Saat Anda menjalankan skrip (atau jika Anda menelusuri situs web dengan browser Anda), Anda akan melihat bagaimana server membutuhkan waktu untuk menangani satu permintaan, sehingga Anda dapat menebak jika server kesulitan menangani satu permintaan, 100 permintaan berturut-turut adalah a sedikit terlalu banyak untuk target Anda.

Namun tetap saja, 16, 17, atau 18 panggilan pertama berfungsi dengan baik. Mungkin server hanya memerlukan lebih banyak waktu di antara setiap kueri untuk menanganinya?

Cukup tambahkan import time di atas file Anda, time.sleep(10) dan di akhir loop dan keuntungan Anda.

Anda pasti ingin menambahkan beberapa log di sana-sini, ini versi kode Anda (saya baru saja menambahkan time.sleep() + beberapa cetakan)

import urllib2
from bs4 import BeautifulSoup
import sys
import StringIO
import re
import time


search_term = 'automobile'
patent_list = []
for i in range(100): #for the first 100 pages of results
    web_page = 'https://www.lens.org/lens/search?q=' + str(search_term) + '&sat=P&l=en&st=true&p=' + str(i) + '&n=100'
    print('fetching {} ({})'.format(i, web_page))
    page = urllib2.urlopen(web_page)
    print('webpage fetched')
    soup = BeautifulSoup(page,'html.parser')

    for aref in soup.findAll("a",href=True):
        if re.findall('/lens/patent',aref['href']):
            link = aref['href']
            split_link = link.split('/')
            if len(split_link) == 4:
                patent_list.append(split_link[-1])

    print('sleeping ten seconds')
    time.sleep(10)
print '\n'.join(set(patent_list))

Sekarang tip pro: Tidak ada lebih dari 400 item dalam database, sehingga Anda dapat menghentikan halaman 4. Anda sebaiknya memeriksa loop Anda apakah Anda mendapatkan hasil dan jika tidak memutus loop.

person Arount    schedule 20.04.2018