如何使用 python beautifulSoup 抓取深层嵌入的链接
how to scrape deeply embeded links with python beautifulSoup
我正在尝试构建一个用于学术目的的 spider/web 爬虫,以从学术出版物中获取文本并将相关链接附加到 URL 堆栈。我正在尝试抓取 1 个名为 'PubMed' 的网站。我似乎无法获取我需要的链接。这是我的示例页面代码,该页面应该代表他们数据库中的其他页面:
website = 'http://www.ncbi.nlm.nih.gov/pubmed/?term=mtap+prmt'
from bs4 import BeautifulSoup
import requests
r = requests.get(website)
soup = BeautifulSoup(r.content)
为了便于阅读,我将 html 树分解为几个变量,以便它们都适合 1 个屏幕宽度。
key_text = soup.find('div', {'class':'grid'}).find('div',{'class':'col twelve_col nomargin shadow'}).find('form',{'id':'EntrezForm'})
side_column = key_text.find('div', {'xmlns:xi':'http://www.w3.org/2001/XInclude'}).find('div', {'class':'supplemental col three_col last'})
side_links = side_column.find('div').findAll('div')[1].find('div', {'id':'disc_col'}).findAll('div')[1]
for link in side_links:
print link
如果您使用 chrome 检查元素查看 html 源代码,应该有其他几个嵌套的 div 带有链接 'side_links'。但是上面的代码会产生以下错误:
Traceback (most recent call last):
File "C:/Users/ballbag/Copy/web_scraping/google_search.py", line 22, in <module>
side_links = side_column.find('div').findAll('div')[1].find('div', {'id':'disc_col'}).findAll('div')[1]
IndexError: list index out of range
如果您转到 url,右侧有一个名为 'related links' 的列,其中包含我希望抓取的 url。但我似乎无法接近他们。在 div 下有一个声明说我正在尝试进入,我怀疑这与它有关。任何人都可以帮助获取这些链接吗?我真的很感激任何指点
问题是侧边栏加载了一个额外的异步请求。
这里的想法是:
- 使用
requests.Session
维护网络抓取会话
- 解析用于获取侧边栏的url
- 跟随 link 并从
div
和 class="portlet_content"
得到 links
代码:
from urlparse import urljoin
from bs4 import BeautifulSoup
import requests
base_url = 'http://www.ncbi.nlm.nih.gov'
website = 'http://www.ncbi.nlm.nih.gov/pubmed/?term=mtap+prmt'
# parse the main page and grab the link to the side bar
session = requests.Session()
soup = BeautifulSoup(session.get(website).content)
url = urljoin(base_url, soup.select('div#disc_col a.disc_col_ph')[0]['href'])
# parsing the side bar
soup = BeautifulSoup(session.get(url).content)
for a in soup.select('div.portlet_content ul li.brieflinkpopper a'):
print a.text, urljoin(base_url, a.get('href'))
打印:
The metabolite 5'-methylthioadenosine signals through the adenosine receptor A2B in melanoma. http://www.ncbi.nlm.nih.gov/pubmed/25087184
Down-regulation of methylthioadenosine phosphorylase (MTAP) induces progression of hepatocellular carcinoma via accumulation of 5'-deoxy-5'-methylthioadenosine (MTA). http://www.ncbi.nlm.nih.gov/pubmed/21356366
Quantitative analysis of 5'-deoxy-5'-methylthioadenosine in melanoma cells by liquid chromatography-stable isotope ratio tandem mass spectrometry. http://www.ncbi.nlm.nih.gov/pubmed/18996776
...
Cited in PMC http://www.ncbi.nlm.nih.gov/pmc/articles/pmid/23265702/citedby/?tool=pubmed
我正在尝试构建一个用于学术目的的 spider/web 爬虫,以从学术出版物中获取文本并将相关链接附加到 URL 堆栈。我正在尝试抓取 1 个名为 'PubMed' 的网站。我似乎无法获取我需要的链接。这是我的示例页面代码,该页面应该代表他们数据库中的其他页面:
website = 'http://www.ncbi.nlm.nih.gov/pubmed/?term=mtap+prmt'
from bs4 import BeautifulSoup
import requests
r = requests.get(website)
soup = BeautifulSoup(r.content)
为了便于阅读,我将 html 树分解为几个变量,以便它们都适合 1 个屏幕宽度。
key_text = soup.find('div', {'class':'grid'}).find('div',{'class':'col twelve_col nomargin shadow'}).find('form',{'id':'EntrezForm'})
side_column = key_text.find('div', {'xmlns:xi':'http://www.w3.org/2001/XInclude'}).find('div', {'class':'supplemental col three_col last'})
side_links = side_column.find('div').findAll('div')[1].find('div', {'id':'disc_col'}).findAll('div')[1]
for link in side_links:
print link
如果您使用 chrome 检查元素查看 html 源代码,应该有其他几个嵌套的 div 带有链接 'side_links'。但是上面的代码会产生以下错误:
Traceback (most recent call last):
File "C:/Users/ballbag/Copy/web_scraping/google_search.py", line 22, in <module>
side_links = side_column.find('div').findAll('div')[1].find('div', {'id':'disc_col'}).findAll('div')[1]
IndexError: list index out of range
如果您转到 url,右侧有一个名为 'related links' 的列,其中包含我希望抓取的 url。但我似乎无法接近他们。在 div 下有一个声明说我正在尝试进入,我怀疑这与它有关。任何人都可以帮助获取这些链接吗?我真的很感激任何指点
问题是侧边栏加载了一个额外的异步请求。
这里的想法是:
- 使用
requests.Session
维护网络抓取会话
- 解析用于获取侧边栏的url
- 跟随 link 并从
div
和class="portlet_content"
得到 links
代码:
from urlparse import urljoin
from bs4 import BeautifulSoup
import requests
base_url = 'http://www.ncbi.nlm.nih.gov'
website = 'http://www.ncbi.nlm.nih.gov/pubmed/?term=mtap+prmt'
# parse the main page and grab the link to the side bar
session = requests.Session()
soup = BeautifulSoup(session.get(website).content)
url = urljoin(base_url, soup.select('div#disc_col a.disc_col_ph')[0]['href'])
# parsing the side bar
soup = BeautifulSoup(session.get(url).content)
for a in soup.select('div.portlet_content ul li.brieflinkpopper a'):
print a.text, urljoin(base_url, a.get('href'))
打印:
The metabolite 5'-methylthioadenosine signals through the adenosine receptor A2B in melanoma. http://www.ncbi.nlm.nih.gov/pubmed/25087184
Down-regulation of methylthioadenosine phosphorylase (MTAP) induces progression of hepatocellular carcinoma via accumulation of 5'-deoxy-5'-methylthioadenosine (MTA). http://www.ncbi.nlm.nih.gov/pubmed/21356366
Quantitative analysis of 5'-deoxy-5'-methylthioadenosine in melanoma cells by liquid chromatography-stable isotope ratio tandem mass spectrometry. http://www.ncbi.nlm.nih.gov/pubmed/18996776
...
Cited in PMC http://www.ncbi.nlm.nih.gov/pmc/articles/pmid/23265702/citedby/?tool=pubmed