使用漂亮的汤导航到下一页
Navigating to next page using beautiful soup
如何使用美汤浏览结果的所有页面。例如我必须抓取这个网站:
http://www.ncbi.nlm.nih.gov/pubmed
搜索查询是
"((oncology) AND breast cancer) AND results in"
without the quotes.
我如何获取所有页面?我尝试查看请求 headers 中的表单数据。尝试修改一些字段。我能够修改它以获得每页 200 个条目。但没有了。我实际上需要遍历页面来获取所有内容。
任何帮助将不胜感激。
假设我现在只想看第4页
代码的相关部分:
post_params = {
'term' : val,
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Pubmed_DisplayBar.PageSize' : 20,
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Pubmed_DisplayBar.sPageSize' : 20,
'coll_start' : 61,
'citman_count' : 20,
'citman_start' : 61,
'coll_start2' : 61,
'citman_count2' : 20,
'citman_start2' : 61,
'CollectionStartIndex': 1,
'CitationManagerStartIndex' : 1,
'CitationManagerCustomRange' : 'false',
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.cPage' : 3,
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.CurrPage' : 4,
}
"""This part handles the scraping business"""
post_args = urllib.urlencode(post_params)
baseurl = 'http://www.ncbi.nlm.nih.gov'
url = 'http://www.ncbi.nlm.nih.gov/pubmed/'
page = urllib2.urlopen(url, post_args)
page = page.read()
soup = BeautifulSoup(page)
soup.prettify()
它仍然获取第一页。一旦这部分成功,我就会考虑迭代这段代码,每次都更改参数。
永远不要抓取 PubMed——总有一种更简单的直接检索数据的方法。安装并使用 BioPython 包。这是一个简单的脚本,可以使用您的查询获取前 10 篇论文:
from Bio import Entrez, Medline
# Always tell NCBI who you are
Entrez.email = "your_address@example.com"
term="((oncology) AND breast cancer) AND resulted in"
handle = Entrez.esearch(db="pubmed", retmax=10, term=term)
record = Entrez.read(handle)
print record['Count'] # see how many hits in your search
for ref in record['IdList']:
handle = Entrez.efetch(db="pubmed", id=ref,
rettype="Medline",
retmode="text")
paper = Medline.read(handle)
# Medline returns a dict from which we can extract the
# fields we desire
print '-' * 30
print paper['TI']
print
print paper['AB']
该手册内容广泛,但您只需阅读有关使用 BioPython Entrez 搜索和获取记录以及使用 BioPython Medline 解析结果的部分。
如何使用美汤浏览结果的所有页面。例如我必须抓取这个网站:
http://www.ncbi.nlm.nih.gov/pubmed
搜索查询是
"((oncology) AND breast cancer) AND results in"
without the quotes.
我如何获取所有页面?我尝试查看请求 headers 中的表单数据。尝试修改一些字段。我能够修改它以获得每页 200 个条目。但没有了。我实际上需要遍历页面来获取所有内容。
任何帮助将不胜感激。
假设我现在只想看第4页
代码的相关部分:
post_params = {
'term' : val,
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Pubmed_DisplayBar.PageSize' : 20,
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Pubmed_DisplayBar.sPageSize' : 20,
'coll_start' : 61,
'citman_count' : 20,
'citman_start' : 61,
'coll_start2' : 61,
'citman_count2' : 20,
'citman_start2' : 61,
'CollectionStartIndex': 1,
'CitationManagerStartIndex' : 1,
'CitationManagerCustomRange' : 'false',
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.cPage' : 3,
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.CurrPage' : 4,
}
"""This part handles the scraping business"""
post_args = urllib.urlencode(post_params)
baseurl = 'http://www.ncbi.nlm.nih.gov'
url = 'http://www.ncbi.nlm.nih.gov/pubmed/'
page = urllib2.urlopen(url, post_args)
page = page.read()
soup = BeautifulSoup(page)
soup.prettify()
它仍然获取第一页。一旦这部分成功,我就会考虑迭代这段代码,每次都更改参数。
永远不要抓取 PubMed——总有一种更简单的直接检索数据的方法。安装并使用 BioPython 包。这是一个简单的脚本,可以使用您的查询获取前 10 篇论文:
from Bio import Entrez, Medline
# Always tell NCBI who you are
Entrez.email = "your_address@example.com"
term="((oncology) AND breast cancer) AND resulted in"
handle = Entrez.esearch(db="pubmed", retmax=10, term=term)
record = Entrez.read(handle)
print record['Count'] # see how many hits in your search
for ref in record['IdList']:
handle = Entrez.efetch(db="pubmed", id=ref,
rettype="Medline",
retmode="text")
paper = Medline.read(handle)
# Medline returns a dict from which we can extract the
# fields we desire
print '-' * 30
print paper['TI']
print
print paper['AB']
该手册内容广泛,但您只需阅读有关使用 BioPython Entrez 搜索和获取记录以及使用 BioPython Medline 解析结果的部分。