WedX - журнал о программировании и компьютерных науках

Отправка нескольких форм в scrapy и достижение нумерации страниц

Я новичок в scrapy, я очищаю сайт, основанный на работе, который состоит из позиций, т. Е. Когда мы нажимаем на позицию, открывается новая страница, которая состоит из данных, которые мне нужно получить.

Например, страница содержит таблицу следующего формата:

      Job Title                  Full/Part Time                             Location/Affiliates
1.   Accountant                   Full Time                           Mount Sinai Medical Center (Manhattan)  
2.   Accountant                   Full Time                           Mount Sinai Medical Center (Manhattan) 
3.   Admin Assistant              Full Time                           Mount Sinai Hospital (Queens) 
4.   Administrative Assistant     Full Time                      Mount Sinai Medical Center (Manhattan)  


Page:  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 

Все названия вакансий, упомянутые выше, являются ссылками, сгенерированными javascript, мне нужно отправить все ссылки javascript со значениями (найденными с помощью firebug). Как отправить несколько форм за раз или как написать один метод, который перебирает все ссылки на названия вакансий. поэтому мы можем получить данные из каждой ссылки на должность.

Также мне нужно разбить на страницы все страницы, упомянутые выше, когда я нажимаю на страницу 2, открывается страница, состоящая из одного и того же формата таблицы с разными позициями работы и т. д., как я могу разбить эти страницы на страницы в scrapy.

Мой код:

class MountSinaiSpider(BaseSpider):
   name = "mountsinai"
   allowed_domains = ["mountsinaicss.igreentree.com"]
   start_urls = [
       "https://mountsinaicss.igreentree.com/css_external/CSSPage_SearchAndBrowseJobs.ASP?T=20120517011617&",
   ]

# This method is for submitting starting page with some values for clicking "Find Jobs"
   def parse(self, response):
       return [FormRequest.from_response(response,
                                        formdata={ "Type":"CSS","SRCH":"Search Jobs","InitURL":"CSSPage_SearchAndBrowseJobs.ASP","RetColsQS":"Requisition.Key¤Requisition.JobTitle¤Requisition.fk_Code_Full_Part¤[Requisition.fk_Code_Full_Part]OLD.Description(sysfk_Code_Full_PartDesc)¤Requisition.fk_Code_Location¤[Requisition.fk_Code_Location]OLD.Description(sysfk_Code_LocationDesc)¤Requisition.fk_Code_Dept¤[Requisition.fk_Code_Dept]OLD.Description(sysfk_Code_DeptDesc)¤Requisition.Req¤","RetColsGR":"Requisition.Key¤Requisition.JobTitle¤Requisition.fk_Code_Full_Part¤[Requisition.fk_Code_Full_Part]OLD.Description(sysfk_Code_Full_PartDesc)¤Requisition.fk_Code_Location¤[Requisition.fk_Code_Location]OLD.Description(sysfk_Code_LocationDesc)¤Requisition.fk_Code_Dept¤[Requisition.fk_Code_Dept]OLD.Description(sysfk_Code_DeptDesc)¤Requisition.Req¤","ResultSort":"" },
                                        callback=self.parse_main_list)]

   def parse_main_list(self, response):
       return [FormRequest.from_response(response,
                                        formdata={ "Key":"","Type":"CSS","InitPage":"1","InitURL":"CSSPage_SearchAndBrowseJobs.ASP","SRCH":"earch Jobs","Search":"ISNULL(Requisition.DatePostedExternal, '12/31/9999')¤BETWEEN 1/1/1753 AND Today¥","RetColsQS":"Requisition.Key¤Requisition.JobTitle¤Requisition.fk_Code_Full_Part¤[Requisition.fk_Code_Full_Part]OLD.Description(sysfk_Code_Full_PartDesc)¤Requisition.fk_Code_Location¤[Requisition.fk_Code_Location]OLD.Description(sysfk_Code_LocationDesc)¤Requisition.fk_Code_Dept¤[Requisition.fk_Code_Dept]OLD.Description(sysfk_Code_DeptDesc)¤Requisition.Req¤","RetColsGR":"Requisition.Key¤Requisition.JobTitle¤Requisition.fk_Code_Full_Part¤[Requisition.fk_Code_Full_Part]OLD.Description(sysfk_Code_Full_PartDesc)¤Requisition.fk_Code_Location¤[Requisition.fk_Code_Location]OLD.Description(sysfk_Code_LocationDesc)¤Requisition.fk_Code_Dept¤[Requisition.fk_Code_Dept]OLD.Description(sysfk_Code_DeptDesc)¤Requisition.Req¤","ResultSort":"[sysfk_Code_Full_PartDesc]" },
                                        dont_click = True,
                                        callback=self.parse_fir_pag_urls)]


   def parse_fir_pag_urls(self, response):
       print response'
21.05.2012

Ответы:


1

Ключевая функция — ваш обратный вызов. Например parse метод. Он вызывается при загрузке страницы из start_urls, и ответ с этой страницей передается методу parse в качестве параметра.

В методе parse вы анализируете (разбираете) страницу, обычно используя HtmlXPathSelector< /a> и соберите необходимые данные с этой страницы, поместив их в файл Item. Если вы собрали все, что вам нужно, вы yield получаете этот предмет, и scrapy определяет, что это предмет, и передает его в конвейеры.

Если страница, которую вы анализируете, не содержит никаких данных (например, это страница категории) или только часть данных, которые вам нужны, и вы нашли на ней ссылку на другую страницу (страницы) с [дополнительными] данными, вместо этого yieldобрабатывая элемент, вы получаете экземпляр Request с URL-адресом другой страницы и другим обратным вызовом.

FormRequest является подклассом Request, поэтому вы можете получить столько FormRequest из метода синтаксического анализа, сколько вам нужно.

Когда вы, наконец, достигли нужной страницы, в соответствующем методе анализа вы извлекаете данные (используя HtmlXPathSelector) и возвращаете экземпляр Item из метода.

21.05.2012
  • :Спасибо за ваш ответ, как я могу добиться нумерации страниц тогда 22.05.2012
  • В обратном вызове, который анализирует страницу результатов поиска, выдайте еще один FormRequest с данными, необходимыми для получения следующей страницы, и обратным вызовом к тому же методу parse. 22.05.2012
  • : Большое спасибо, я понял это, в любом случае, можете ли вы предоставить мне небольшой пример, чтобы я мог сделать это более гибким. 22.05.2012
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]