Web of science文章信息爬取

学习内容:

提示:url参数分析+Python爬虫
前期准备:
1、 安装requests、bs4第三方模块(可以用pip install 第三方模块名称)
2、 了解html的基本定位
3、 Python爬虫基本


基本思路:

1.通过Web of science的检索文章,并构造请求网址来获取页面html代码

2.将响应的html代码使用bs4模块中的Beautifulsoup将html进行解析并提取有效的内容

3.将有效内容储存成CSV表格


开始实操:

首先我们以打开Web of science的检索界面

这里我以搜索PHYSICAL EDUCATION AND SPORT PEDAGOGY为例,然后点击检索,然后就会出现我们想要的文章的信息

然后我们再点击文章的链接,查看具体信息:

这些信息基本都是对我们有用的,所以需要全部整理保存下来。

接下来就是重点了!!!就是要怎么获取这些文章。

通过查看url:

第一篇:http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc=1&cacheurlFromRightClick=no

第二篇:http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc=2&cacheurlFromRightClick=no

第三篇:http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc=3&cacheurlFromRightClick=no

第四篇:http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc=4&cacheurlFromRightClick=no

......

通过观察url的不同之处,就是doc=xxx,第一篇就是1,第二篇就是1,第n篇就是n,所以通过这个规律,我们就可以把522篇的文章的链接地址全部生成,然后再用Python的requests去访问地址,就可以把文章的html代码获取出来了

话不多说,上代码!

def main():
    url_list = []
    
    for i in range(1,523):    
        url = 'http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc=" + str(i) + "&cacheurlFromRightClick=no'
        url_list.append(url)
    print(url_list)

if __name__ == '__main__':
    main()

OK,在url_list里头已经存储了我们需要的的所有文章的链接地址了,只要逐个请求就好了

接下来就是解析网页的信息,提取出我们想要的内容,通过浏览器的元素检查功能(快捷键F12),然后定位到我们想要的内容区域,然后复制他们的classname(也就是标签后面的class=xxx),这里可以看到标题的class是title,其他信息基本是block-record-info

当然到了这里或许有人问:为什么不用xpath或者css选择器之类的问题。通过多篇文章观察发现,页面的排版并不是特别的规律,所以我们不能直接简单的位置进行提取,而是通过class名,然后对其内容进行解析才可以判断出属于那一部分内容

所以接下来我就是通过Beautifulsoup进行解析html,然后将Beautifulsoup解析出的对象命名为soup,然后我通过编写一个类,来对soup进行解析,代码如下:

class Html_data:
    def __init__(self, soup):
        self.title = ''
        self.author = ''
        self.abstract = ''
        self.keywords = ''
        self.author_data = ''
        self.data = ''
        self.soup = soup
        self.title = soup.find(attrs={'class':'title'}).text.replace('\n','')

        try:
            self.data = soup.find(attrs={'class':'block-record-info block-record-info-source'}).text
        except:
            pass
        
        items = soup.find_all(attrs={'class':'block-record-info'})

        for item in items:
            if len(item.attrs['class']) > 1:
                continue
            if 'By:' in item.text:
                self.author = item.text.replace('By:','').replace('\n','').replace('  ','').replace(' ]',']')
                continue
            elif 'Abstract' in item.text:
                self.abstract = item.text
                continue
            elif 'Keywords' in item.text:
                self.keywords = item.text
                continue
            elif 'Author Information' in item.text:
                self.author_data = item.text 
                continue

通过这个Html_data类,将soup对象传入实例化Html_data类,就可以将其属性信息取出。

接下来我们就可以实操一下,将类实例化,并获取数据,将数据储存成csv。

以下代码接入main函数中url_list后面,代码如下:

for url in url_list:
    # 遍历前面我们生成的所有文章的url
    headers = {
                'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
            }
    respon = requests.get(url, headers = headers)
    if respon:
        html = respon.text
        soup = BeautifulSoup(html,'lxml')
        Html_data = Html_data(soup)
        
        # 获取对象信息
        title = html_data.title 
        authors = html_data.author
        abstract = html_data.abstract
        authors_data = html_data.author_data
        data = html_data.data
        keywords = html_data.keywords
        
        # 储存数据到csv        
        csv_data = [title, authors, abstract, authors_data, data, keywords, url]
        print(csv_data)
        with f = open('1.csv', encoding='utf-8', mode='a', newline='') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow(csv_data)

                

跑完所有url之后,在代码的运行目录下就会生成1.csv的表格文件,通过正则表达式提取和处理这些信息之后,就可以得到我们想要的内容(这里有空的部分,如abstract其实是有数据的,因为文字很多,第一行是换行符,所以显示空的),比如time、keyword都是用正则表达式提取出来的

本次文章到此结束了,主要还是以思路为主,代码也只是辅助理解,具体实现的代码需要自己自行修改。

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

左手八嘎呀路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值