#python #post #scrapy
#python #Публикация #scrapy
Вопрос:
Мой код запущен, но я точно знаю, как это работает, а затем мне нужно расширить эту функцию..
Я хочу выполнить цикл методом POST с тем же URL-адресом после входа в систему..
class myspider(scrapy.Spider):
name = 'myspider'
start_urls = ['login_url']
target_urls = 'target_url'
# sent data
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={'user': 'x', 'pass': 'y'},
callback=self.after_login
)
# responds after login form sent
def after_login(self, response):
if "authentication failed" in response.text:
self.log("Login failed", level=log.ERROR)
return
hxs = scrapy.Selector(response)
yum = hxs.xpath('//span[@id="userName"]/text()').get()
# responds after login result extracted
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(spider_new_fee, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_idle,
signal=scrapy.signals.spider_idle)
return spider
# Second parsing
def spider_idle(self):
self.crawler.signals.disconnect(self.spider_idle,
signal=scrapy.signals.spider_idle)
mydata={'param1': param1, 'param2': param2, 'param3': 'param3'}
self.crawler.engine.crawl(scrapy.Request(
url_target,
method='POST',
body=json.dumps(mydata),
headers={'Content-Type':'application/json'},
callback=self.parse_page2
), self)
raise DontCloseSpider
# Extract second parsing
def parse_page2(self, response):
self.logger.info("Visited %s", response.url)
hxs = scrapy.Selector(response)
root = lxml.html.fromstring(response.body)
lxml.etree.strip_elements(root, lxml.etree.Comment, "script", "head")
try:
data= lxml.html.tostring(root, method="text", encoding=str)
except Exception as e:
data= lxml.html.tostring(root, method="text", encoding=unicode)
texts = json.loads(data)
res={}
# do something with result
return res
Этот код работает, я вхожу в систему и очищаю следующий URL с логином.. Успешный вход в систему и успешное получение элемента результата внутри URL, а затем после первого (метод idle) этого очищает следующий URL и, наконец, анализирует результат..
Но, черт возьми, это лучший метод для очистки после входа в систему?, и какой-нибудь более зрелый код для решения этой задачи?, есть ли хорошее техническое объяснение (мое объяснение слишком простое)?, и, наконец, как этот код мог бы очистить больше с помощью итерации target_url с другим запросом POST,, я хочу добавить в метод idle, но все равно не получается,,
некоторые неудачные попытки :
multi_param = self.allparam.split("-")
for param in multi_param:
self.logger.info("Visited %s", target_url)
mydata={'param1': param1, 'param2': param2, 'param3': 'param3'}
self.crawler.engine.crawl(scrapy.Request(
url=target_url,
method='POST',
body=json.dumps(mydata),
dont_filter=True,
callback=self.parse_page2
), self)
еще одна неудачная попытка :
Я удаляю метод класса функций, и после входа в систему я добавляю еще одну очистку, это сбой, потому что он не получил сеанс при входе в систему .. : (
Спасибо за помощь,,
Ответ №1:
Я думаю, вам нужно добавить некоторый код в spider_idle
это происходит при отправке второго запроса,,
что-то вроде :
def spider_idle(self):
allparam = self.listparam.split("-")
for param in allparam:
mydata={'param1': param}
self.crawler.engine.crawl(scrapy.Request(
url=self.target_url,
method='POST',
body=json.dumps(my_data),
dont_filter=True,
headers={'Content-Type':'application/json'},
callback=self.parse_page2
), self)
Это code
повторит ваш запрос POST,, надеюсь, это поможет..