gpt4 book ai didi

javascript - 使用隐藏链接 url 的 __doPostBack 进行抓取

转载 作者:太空狗 更新时间:2023-10-29 21:08:39 24 4
gpt4 key购买 nike

我正在尝试从使用 __doPostBack 函数的网站抓取搜索结果。该网页为每个搜索查询显示 10 个结果。要查看更多结果,必须单击触发 __doPostBack javascript 的按钮。经过一些研究,我意识到 POST 请求的行为就像一个表单,可以简单地使用 scrapy 的 FormRequest 来填写该表单。我使用了以下线程:

Troubles using scrapy with javascript __doPostBack method

编写以下脚本。

# -*- coding: utf-8 -*- 
from scrapy.contrib.spiders import CrawlSpider
from scrapy.http import FormRequest
from scrapy.http import Request
from scrapy.selector import Selector
from ahram.items import AhramItem
import re

class MySpider(CrawlSpider):
name = u"el_ahram2"

def start_requests(self):
search_term = u'اقتصاد'
baseUrl = u'http://digital.ahram.org.eg/sresult.aspx?srch=' + search_term + u'&archid=1'
requests = []
for i in range(1, 4):#crawl first 3 pages as a test
argument = u"'Page$"+ str(i+1) + u"'"
data = {'__EVENTTARGET': u"'GridView1'", '__EVENTARGUMENT': argument}
currentPage = FormRequest(baseUrl, formdata = data, callback = self.fetch_articles)
requests.append(currentPage)
return requests

def fetch_articles(self, response):
sel = Selector(response)
for ref in sel.xpath("//a[contains(@href,'checkpart.aspx?Serial=')]/@href").extract():
yield Request('http://digital.ahram.org.eg/' + ref, callback=self.parse_items)

def parse_items(self, response):
sel = Selector(response)
the_title = ' '.join(sel.xpath("//title/text()").extract()).replace('\n','').replace('\r','').replace('\t','')#* mean 'anything'
the_authors = '---'.join(sel.xpath("//*[contains(@id,'editorsdatalst_HyperLink')]//text()").extract())
the_text = ' '.join(sel.xpath("//span[@id='TextBox2']/text()").extract())
the_month_year = ' '.join(sel.xpath("string(//span[@id = 'Label1'])").extract())
the_day = ' '.join(sel.xpath("string(//span[@id = 'Label2'])").extract())
item = AhramItem()
item["Authors"] = the_authors
item["Title"] = the_title
item["MonthYear"] = the_month_year
item["Day"] = the_day
item['Text'] = the_text
return item

我现在的问题是永远不会调用“fetch_articles”:

2014-05-27 12:19:12+0200 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2014-05-27 12:19:13+0200 [el_ahram2] DEBUG: Crawled (200) <POST http://digital.ahram.org.eg/sresult.aspx?srch=%D8%A7%D9%82%D8%AA%D8%B5%D8%A7%D8%AF&archid=1> (referer: None)
2014-05-27 12:19:13+0200 [el_ahram2] DEBUG: Crawled (200) <POST http://digital.ahram.org.eg/sresult.aspx?srch=%D8%A7%D9%82%D8%AA%D8%B5%D8%A7%D8%AF&archid=1> (referer: None)
2014-05-27 12:19:13+0200 [el_ahram2] DEBUG: Crawled (200) <POST http://digital.ahram.org.eg/sresult.aspx?srch=%D8%A7%D9%82%D8%AA%D8%B5%D8%A7%D8%AF&archid=1> (referer: None)
2014-05-27 12:19:13+0200 [el_ahram2] INFO: Closing spider (finished)

找了几天感觉完全卡住了。我是 python 的初学者,所以错误可能是微不足道的。但是,如果不是,则此线程可能对许多人有用。预先感谢您的帮助。

最佳答案

您的代码没问题。 fetch_articles 正在运行。您可以通过添加打印语句来测试它。

但是,该网站要求您验证 POST 请求。为了验证它们,您的请求正文中必须包含 __EVENTVALIDATION__VIEWSTATE 以证明您正在响应它们的表单。为了获得这些,您需要先发出 GET 请求,并从表单中提取这些字段。如果你不提供这个,你会得到一个错误页面,它不包含任何带有“checkpart.aspx?Serial=”的链接,所以你的 for 循环没有被执行。

这是我设置 start_request 的方式,然后 fetch_search 执行 start_request 过去的操作。

class MySpider(CrawlSpider):
name = u"el_ahram2"

def start_requests(self):
search_term = u'اقتصاد'
baseUrl = u'http://digital.ahram.org.eg/sresult.aspx?srch=' + search_term + u'&archid=1'
SearchPage = Request(baseUrl, callback = self.fetch_search)
return [SearchPage]

def fetch_search(self, response):
sel = Selector(response)
search_term = u'اقتصاد'
baseUrl = u'http://digital.ahram.org.eg/sresult.aspx?srch=' + search_term + u'&archid=1'
viewstate = sel.xpath("//input[@id='__VIEWSTATE']/@value").extract().pop()
eventvalidation = sel.xpath("//input[@id='__EVENTVALIDATION']/@value").extract().pop()
for i in range(1, 4):#crawl first 3 pages as a test
argument = u"'Page$"+ str(i+1) + u"'"
data = {'__EVENTTARGET': u"'GridView1'", '__EVENTARGUMENT': argument, '__VIEWSTATE': viewstate, '__EVENTVALIDATION': eventvalidation}
currentPage = FormRequest(baseUrl, formdata = data, callback = self.fetch_articles)
yield currentPage

...

关于javascript - 使用隐藏链接 url 的 __doPostBack 进行抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23885771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com