前言
爬虫有风险,仅作为个人学习研究,无商业用途。
背景
做过学术研究的小伙伴都很应该很清楚知网了,看英文文献的话更加不会错过Elsevier,sciencedirect。每当老板问:知道别人都在做一些什么研究吗?别的组都在从事什么方向了解吗?相关文献要多读一下。。。开始踏入学术圈的嘎杂,犹如无头苍蝇,摸不清楚方向,就算打不死也要愁死了。当然如今的工具琳琅满目,很多问题只需要点点鼠标就可以带给我们答案。但嘎杂并不满足于现状,它想发现更加有趣的东西,它的好奇心想知道,每年某期刊都发了多少文章,每个月都发了多少文章,自己领域课题的文章占总文章的多少,哪些课题组产文章很强。。。这鼠标操作可解决不了啊,嘎杂在苦苦寻找其他解决方案。
最近它得知一传说,在网上有一神兽,可以有呼天唤地之力量,在互联网中穿梭自由,过及之处,可挥一挥衣袖,带走所有云彩,这就是—爬虫。
小伙伴问:“不需要这么麻烦,我去买一个不就完事了,要学会运用资本的力量。“ 嘎杂想了一下,觉的非常有道理,于是乎去联系了一下各路神仙,发现的确用钱能解决的事情那都不是事情,但是要有一个重要的前提,那就是得有点💰。
晚上躺在床上辗转反侧,夜不能寐,掏了一下自己的兜,仰天长啸问自己值得吗?另一个自己对自己说:“自己养一只🐛吧,一劳永逸。“
于是乎一个跟斗滚下来,开始了训🐛计划。
培养一只训练有素的爬虫需要我们给予它正确的平台和装备,好的枪才能打到猎物,嘎杂在这里选择的就是python,装备当然就是python包:requests, beautifulsoup, re, json, pandas等等,主要要根据自己的应用场景和需求,增添自己的装备。
本场景就是带大家装备自己的学术爬虫,来在sciencedirect上爬取自己想要的学术信息,为以后的数据分析提供数据基础。
基础知识
requests
requests的功能十分强大,但对嘎杂来说就一个,那就是读一下网页地址。
比如说:某一篇学术文章
嘎杂想把这里面的关键信息内容都获取到,那就肯定要先让python打开这个网站读一下。
import requests
url = 'https://www.sciencedirect.com/science/article/pii/S2666651020300012'
headers = {
'user-agent': '(Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
res = requests.get(url, headers=headers)
这里的headers主要的作用就是模拟人的行为,因为这是一场智慧的博弈,有攻就有守,有的网站也有反爬虫利器,为了防不胜防,只能让自己更像人,但仅仅有headers也不是总管用,后续要进阶就要使用更高级的伪装方法。目前仅仅用headers够用了,严谨地说,在发表此博客的这个时刻。至于高级的伪装方法,那就是。。嘎杂也还没会🤭。
beautifulsoup
美丽汤,是爬🐛的营养物,也是嘎杂的营养物,当喝下这碗汤,就像吃了哆啦A梦的记忆🍞,把知识点都记入脑袋里了。
from bs4 import Beautifulsoup
bsObj = Beautifulsoup(res, 'lxml')
输出一下,发现好乱啊,遇事不要慌,先掏出电脑。。。打开chrome浏览器。。。
这里需要有一点点浏览器知识。
Chrome 中的 inspect
选择到某一块内容,点击鼠标右键,点击inspect。
然后发现新大陆
原来这些页面上的文字就是这么产生出来的。
bsObj其实就是把这个网页中的源代码读取下来了。
这时候就发现规律了,每一块内容对应到不同的<xxx>.$.%.&#.<xxx>里头,那我只要定位就可以找到相应的内容了吧?
这里我们用findAll(可以有很多方式达到,比如说用find也可以,这里提供我自己用的其中一个方式)。这个输出返回的是一个list
title = bsObj.findAll('span', class_="title-text")
print(title)
>output:[<span class="title-text">AI-driven drug discovery: A boon against COVID-19?</span>]
那我只想要里头的题目内容怎么办呢?👇
title_text = title[0].text
print(title_text)
>output:'AI-driven drug discovery: A boon against COVID-19?'
感觉还不错啊!那其他的一些信息是不是也可以这么找到呢?基本能显示在页面上的是可以的,