1. 程式人生 > >Web of Science爬蟲實戰(模擬瀏覽器)

Web of Science爬蟲實戰(模擬瀏覽器)

一.概述

本次爬蟲主要通過論文的入藏號來檢索出該論文,從而爬取該論文的被引量,近180天下載量以及全部下載量。這裡使用的是Web of Scienece 核心合集,並且使用python的selenium庫進行模擬瀏覽器的操做

二.網站及爬取策略分析

圖1:檢索頁面

注意以上三塊標紅的地方要與我設定成一樣,然後我隨便輸入個入藏號000370884200013,點選檢索即可進入我們需要爬取的頁面如下

2.爬取頁面

看到右側用紅框標出的頁面滑鼠移到上面右鍵檢查即課開啟該開發者頁面,具體分析裡面的html

三.安裝相應的包

這邊主要用到了selenium包,可以用pip來安裝,pip install -U selenium

。但是這裡你可能還是不能用,你還需要chrome瀏覽器或者火狐等,我用了chrome。

但是主要下載後的驅動程式請放到你chrome的目錄下(在我電腦上的路徑是C:\Program Files(x86)\Google\Chrome\Application),或者配置到環境變數下(但是該方法我不知道為什麼沒成功)

四.爬蟲程式碼

下面即是完整的python程式碼,你也可以點選https://github.com/jgzquanquan/Spyder_wos/blob/master/wos.py進入我的github檢視

import re
from urllib import parse
import requests
from bs4 import BeautifulSoup
import bs4
from lxml import etree
from selenium import webdriver
import time
def geturl(Num):
    Str = "\""+Num+"\""
    driver = webdriver.Chrome()
    url = 'http://apps.webofknowledge.com/WOS_GeneralSearch_input.do?product=WOS&SID=6FAEOvziD7rmWrbUJk6&search_mode=GeneralSearch'
    driver.get(url)
    driver.find_element_by_id("clearIcon1").click()#點選清除輸入框內原有快取地址
    driver.find_element_by_id("value(input1)").send_keys(Num)#模擬在輸入框輸入入藏號
    driver.find_element_by_id("WOS_GeneralSearch_input_form_sb").click()#模擬點選檢索按鈕
    url1 = driver.current_url
    driver.close()
    return url1
# 該函式用Requests庫將網頁爬取下來
def getHTMLText(url):
    # 爬取網頁的通用程式碼框架
    try:
        kv = {'user-agent': 'Mozilla/5.0'}#該引數是設定用瀏覽器的形式訪問網站
        r = requests.get(url, headers=kv,timeout=30)#爬取網頁生成response物件
        r.raise_for_status()
        r.encoding = r.apparent_encoding#判斷是否爬取成功
        return r.text         #返回爬蟲的文字內容
    except:
        return ""

def html_parse(html,ID):
    if html is None:
        print("html count:", html)
        return
    try:
        tree = etree.HTML(html)
        cited = tree.xpath("//div[@class='search-results-data-cite']/a/text()")#解析頁面獲取被引量
        download = tree.xpath(".//div[@class='alum_text']/span/text()")#解析頁面獲取下載量
        print(cited,download)
        Str=""
        if len(cited)==0:
            Str = "0" + "," + download[0] + "," + download[1]

        else:
            Str = cited[0] + "," + download[0] + "," + download[1]
        return Str
    except:
        print(ID)


def main():
    uinfo=[]

    queryFile = open("wos1.txt", 'r', encoding='utf-8')
    for query in queryFile:
        fout = open('WosOutput.txt', 'a', encoding='utf-8')
        # 將輸入檔案中的每一行分割成導師姓名和學校
        splitRes = query.split(',')
        if len(splitRes) != 3:
            print(query, ' 格式不正確')
        else:
            uinfo = []
            ID = query.split(',')[0]
            Name = query.split(',')[1]
            Num = query.split(',')[2][4:-1]
            url = geturl(Num)
            html = getHTMLText(url)
            data = html_parse(html,ID)
            Str = str(ID)+","+str(Name)+","+str(Num)+","+str(data)
            print(Str)
            fout.write(Str+ '\n')
            fout.close()

    queryFile.close()

main()


五.問題

用該種方式爬蟲速度非常慢,如果資料量大的話請謹慎考慮。我用這種方法是走投無路,不過後來又發現新的方法,具體請看下一篇。