3

公開検索から検索結果を自動的に取得しようとしていますが、問題が発生しています。URL の形式は次のとおりです。

http://www.website.com/search.aspx?keyword=#&&page=1&sort=Sorting

ページをクリックしていくうちに、このページにアクセスした後、わずかに

http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page=2

問題は、最初のリンクに最初にアクセスせずに 2 番目のリンクに直接アクセスしようとすると、最初のリンクにリダイレクトされることです。これに対する私の現在の試みは、scrapy で start_urls の長いリストを定義することです。

class websiteSpider(BaseSpider):
    name = "website"
    allowed_domains = ["website.com"]
    baseUrl = "http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page="
    start_urls = [(baseUrl+str(i)) for i in range(1,1000)]

現在、このコードは単に最初のページに何度もアクセスするだけです。これはおそらく簡単だと思いますが、これを回避する方法がよくわかりません。

更新: これについて調査を進めた結果、__doPostBack(arg1, arg2) を使用して前のページに POST リクエストを送信することで、サイトが各ページを更新していることがわかりました。私の質問は、scrapy を使用してこの POST リクエストをどのように正確に模倣するかです。POST リクエストの作成方法は知っていますが、必要な引数を渡す方法は正確にはわかりません。

2 番目の更新: 私は多くの進歩を遂げています! 私は思う...私は例とドキュメントを見て、最終的にこのトリックを行うべきだと思うもののこのバージョンをまとめました:

def start_requests(self):
    baseUrl = "http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page="
    target = 'ctl00$empcnt$ucResults$pagination'
    requests = []
    for i in range(1, 5):
        url = baseUrl + str(i)
        argument = str(i+1)
        data = {'__EVENTTARGET': target, '__EVENTARGUMENT': argument}
        currentPage = FormRequest(url, data)
        requests.append(currentPage)
    return requests

これは、POST リクエストをフォームのように扱い、それに応じて更新するという考え方です。ただし、実際にこれを実行しようとすると、次のトレースバックが表示されます (簡潔にするために要約しています)。

2013-03-22 04:03:03-0400 [guru] ERROR: Unhandled error on engine.crawl()
dfd.addCallbacks(request.callback or spider.parse, request.errback)
      File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 280, in addCallbacks
        assert callable(callback)
    exceptions.AssertionError: 

2013-03-22 04:03:03-0400 [-] ERROR: Unhandled error in Deferred:
2013-03-22 04:03:03-0400 [-] Unhandled Error
    Traceback (most recent call last):
    Failure: scrapy.exceptions.IgnoreRequest: Skipped (request already seen)

質問を変更して、この投稿がどうなったかをより明確にします。

考え?

PS 2 番目のエラーが発生すると、scrapy はシャットダウンを正常に実行できず、実際に処理を完了するために SIGINT を 2 回送信する必要があります。

4

1 に答える 1

2

FormRequestのコンストラクタに位置引数がありませんformdata:

class FormRequest(Request):
    def __init__(self, *args, **kwargs):
        formdata = kwargs.pop('formdata', None)

だからあなたは実際に言わなければならないformdata=

requests.append(FormRequest(url, formdata=data))
于 2013-03-22T18:37:14.977 に答える