使用Scrapy进行POST请求
我正在尝试抓取http://www.ncbi.nlm.nih.gov/pubmed的搜索结果。我在第一页收集了所有有用的信息,但在导航到第二页时遇到了问题(第二页没有结果,可能是请求中的某些参数缺失或错误)。
我的代码是:
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中已启用cookies。
1 个回答
1
如果你在NCBI网站上查找信息,为什么不使用专门为这种研究设计的E-Utilities呢?这样可以避免网站返回的滥用通知(也许你的爬虫程序也遇到过这个问题)。
我知道这个问题已经有点久了,但总会有人碰到同样的问题……
你的基本网址是: 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。