一文搞定ScienceDirect旗下所有期刊最新期目内容的爬取——仅个人学习使用,切勿滥用

本文仅作个人学习使用,请勿滥用网络资源
作为一名学术劳工,每天免不得要去寻找需要的文献来看,而通常都是在某几个特定的期刊上浏览,为了方便学习,也为了保持敲代码的手感,这次就来爬取一下SceienceDirect旗下期刊的最新内容。由于所有的期刊的网页结构一样,所以就将整个爬取过程抽象出来,这样就可以爬取所有期刊了,以备后续深入学习。

思路

整个代码其实很简单,以earth-science-reviews这个期刊为例
在这里插入图片描述
可以看到我需要的内容在红色圈中,就可以先获取到该链接,然后进入
在这里插入图片描述
这里,我需要最新期目的期目号和发行时间,以及每篇文章的题目和链接。

代码

这里我新建了一个ScienceDirect类,可用过新建实例,并输入期刊,如’earth-science-reviews’,这个一定要注意格式,懒得做一个格式转换了。(因为我比较熟悉期刊~~)

import requests
from bs4 import BeautifulSoup


class ScienceDirect:

    def __init__(self, journal):
        self.subject = journal
        self.base_url = 'https://www.sciencedirect.com'

    def latest_issue(self):
        content = ''
        url = self.base_url + '/journal/' + self.subject
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36'}

        re = requests.get(url, headers=headers)
        soup = BeautifulSoup(re.text, 'html.parser')

        real_url = self.base_url + soup.find_all('div', class_='u-margin-s-top issue')[2].find('a')['href']
        real_re = requests.get(real_url, headers=headers)
        real_soup = BeautifulSoup(real_re.text, 'html.parser')

        articles = real_soup.find_all('li', class_='js-article-list-item article-item u-padding-xs-top u-margin-l-bottom')
        volume = real_soup.find('h2', class_='u-text-light u-h1 js-vol-issue').text
        dates = real_soup.find('h3', class_='js-issue-status text-s').text
        subject = '{} {} {}'.format(self.subject, volume, dates)

        for article in articles:
            title = article.find('span', class_='js-article-title').text
            link = self.base_url + article.find('a', class_='anchor article-content-title u-margin-xs-top u-margin-s-bottom')['href']
            content += '{}\n{}\n'.format(title, link)
        return subject, content


if __name__ == '__main__':
    s, c = ScienceDirect('earth-science-reviews').latest_issue()
    print(s)
    print(c)

效果

在这里插入图片描述
祝各位学习愉快,工作顺利。共勉。

### 如何使用Python爬虫从ScienceDirect下载文献PDF 为了实现从ScienceDirect网站自动下载文献PDF的功能,通常需要构建一个能够处理登录验证、解析页面以及下载文件的自动化脚本。考虑到Sciencedirect对于访问频率有一定的限制,并且可能需要订阅或付费才能查看某些文章全文,在开发此类程序前应当了解并遵守标网站的服务条款。 下面是一个简化版本的概念证明代码片段,用于说明如何利用`requests`库模拟浏览器行为来获取网页内容,并尝试定位到具体的PDF链接进行下载: ```python import requests from bs4 import BeautifulSoup def get_pdf_link(url, session): response = session.get(url) soup = BeautifulSoup(response.text, 'html.parser') pdf_anchor = soup.find('a', {'data-pdfurl': True}) if not pdf_anchor: raise Exception("No PDF link found.") return pdf_anchor['data-pdfurl'] def download_file(download_url, filename, session): with open(filename, "wb") as f: response = session.get(download_url, stream=True) total_length = response.headers.get('content-length') if total_length is None: # no content length header f.write(response.content) else: dl = 0 total_length = int(total_length) for data in response.iter_content(chunk_size=4096): dl += len(data) f.write(data) if __name__ == '__main__': base_url = 'https://www.sciencedirect.com/science/article/pii/' pii_number = input("Enter PII number:") full_url = "{}{}".format(base_url, pii_number) s = requests.Session() login_data = { 'username': '<your username>', 'password': '<your password>' } s.post('<login url>', data=login_data) # 登录过程取决于具体站点设计 try: pdf_download_path = get_pdf_link(full_url, s) print(f"Found direct PDF URL at {pdf_download_path}") file_name = pii_number + ".pdf" download_file(pdf_download_path, file_name, s) print(f"{file_name} has been downloaded successfully!") except Exception as e: print(e) ``` 此段代码展示了基本的工作流程,包括建立会话(`Session`)对象以便维持用户的认证状态;发送POST请求完成登录操作(注意实际应用时需替换为正确的表单字段名和URL);接着调用函数检索指定DOI的文章详情页中的直链地址;最后执行文件下载并将结果保存至本地磁盘上[^1]。 需要注意的是,上述例子适用于那些允许公开访问的部分资源或者是已经购买了相应权限的情况下的合法使用场景。如果遇到验证码或者其他形式的身份验证机制,则还需要额外引入诸如Selenium这样的工具来进行更复杂的交互式浏览模拟[^2]。 另外,当涉及到批量任务时,可以考虑采用异步I/O模型提高效率,比如借助`asyncio`配合`aiohttp`等第三方包实现并发抓取多个文档的操作[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALittleHigh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值