2014-05-10 178 views
2

我试图取消http://www.ncbi.nlm.nih.gov/pubmed的搜索结果。我在第一页收集了所有有用的信息,但我在第二页的导航中遇到问题(第二页没有任何结果,请求中的某些参数缺失或错误)。使用scrapy发出POST请求

我的代码是:

class PubmedSpider(Spider): 
    name = "pubmed" 
    cur_page = 1 
    max_page = 3 
    start_urls = [ 
      "http://www.ncbi.nlm.nih.gov/pubmed/?term=cancer+toxic+drug" 
    ] 

    def parse(self, response): 
     sel = Selector(response) 
     pubmed_results = sel.xpath('//div[@class="rslt"]') 
     #next_page_url = sel.xpath('//div[@id="gs_n"]//td[@align="left"]/a/@ href').extract()[0] 
     self.cur_page = self.cur_page + 1 
     print 'cur_page ','*' * 30, self.cur_page 

     form_data = {'term':'cancer+drug+toxic+', 
        'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.Page':'results', 
        'email_subj':'cancer+drug+toxic+-+PubMed', 
        'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.CurrPage':str(self.cur_page), 
        'email_subj2':'cancer+drug+toxic+-+PubMed', 
        'EntrezSystem2.PEntrez.DbConnector.LastQueryKey':'2', 
        'EntrezSystem2.PEntrez.DbConnector.Cmd':'PageChanged', 
        'p%24a':'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.Page', 
        'p%24l':'EntrezSystem2', 
        'p%24':'pubmed', 
        } 

     for pubmed_result in pubmed_results: 
      item = PubmedItem() 

      item['title'] = lxml.html.fromstring(pubmed_result.xpath('.//a')[0].extract()).text_content() 
      item['link'] = pubmed_result.xpath('.//p[@class="title"]/a/@href').extract()[0] 

      #modify following lines 
      if self.cur_page < self.max_page: 
       yield FormRequest("http://www.ncbi.nlm.nih.gov/pubmed/?term=cancer+toxic+drug",formdata = form_data, 
       callback = self.parse2, method="POST") 

      yield item 

    def parse2(self, response): 
     with open('response_html', 'w')as f: 
      f.write(response.body) 

饼干在settings.py

回答

0

如果您搜索的NCBI的信息,你为什么不使用E-实用程序专为这种类型的研究启用?这将避免从网站返回的滥用通知(也许这也发生在您的刮板)。

我知道这个问题是很老,但它可能发生在别人同样的问题绊倒......

您的基本网址是:http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=cancer+toxic+drug

您可以找到查询参数的说明这里:http://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.ESearch(为每个查询更多结果以及如何提前)

使用这个API,你可以让你使用一些其他工具和更新的Python 3。