从Web of Science 爬取文章作者邮箱小记

最近因为课题组任务需要承接某国际会议,需要查阅给定文献作者的邮箱,因为数量较多,所以决定采用爬虫的方式来完成。
本文章主要在《Web of Science爬虫实战(Post方法)》(https://blog.csdn.net/jgzquanquan/article/details/78827413),此文的基础上进行改编。
如有错误请尽情指出,欢迎友好交流。
一、搜索关键词
从Web of Science 爬取文章作者邮箱小记_第1张图片
搜索界面部分提交数据依照上文所述博客中的方法,采用post提交。这一步请参阅该博客文章,在此不进行详细阐述
对于得到的搜索页面进行分析
从Web of Science 爬取文章作者邮箱小记_第2张图片
在假设标题足够精确的情况下,第一篇文章即为所求。
因此只需在页面中分析得到第一篇文章的地址即可。
从Web of Science 爬取文章作者邮箱小记_第3张图片
于是找到如下结构。
图中蓝色url即为所求链接。
因此书写以下XPath:
“//div[@class=‘search-results’]/div[1]/div[3]/div[1]/div/a/@href”
在此说明一点,页面不尽相同,所以上述Xpath可能并不合适,建议在该搜寻语句处设置断点,对etree中储存的xml页面进行实时的分析来获得恰当的xpath。
从Web of Science 爬取文章作者邮箱小记_第4张图片
二、访问url
这一步较为简单,只需再次访问得到的url即可,
但是要注意以下几个问题:
1、url地址可能有问题
这一部分目前无明确结论,仍需进行进一步的实验,但是有证据表明得到的url可能并不能使用在访问上,在笔者的实际测试中,如下的url在点击访问时无法成功
http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5D7OHW9tDJiNZctsZJP&page=1&doc=1
而将qid=1改为qid=4后即可成功,但在最新的测试中发现可能并不需要改变,上述情况只是因为获取url到访问url间隔时间较长导致。
但是可以明确的一点是,随着时间的推移(根据目前的测试来看是一小时),webofscience会改变链接中的qid值,但具体变化范围尚不明确,笔者测试中有出现qid=1,qid=2,qid=4,qid=457等情况出现,此部分仍需后续讨论。
2、请求头与cookie
根据对网页的分析表明,请求方式是get
从Web of Science 爬取文章作者邮箱小记_第5张图片
因此理论上来说采用get方法访问即可。
但是在实际测试中发现,直接使用get方法web of Science会拒绝访问,出现以下界面
从Web of Science 爬取文章作者邮箱小记_第6张图片
在研究后发现,应为Request header和Cookie的问题,分析表明web of science对于每一次给定的搜索请求都会产生一个固定的cookie用以追踪,因此需要在get方法中加入第一次请求中得到的cookie。因此实际get请求如下:
在这里插入图片描述
三、分析结果页面
因为此次是搜索作者邮箱,因此定位到作者邮箱位置
从Web of Science 爬取文章作者邮箱小记_第7张图片
对html进行分析,得到xpath如下:
mail=newTree.xpath("//a[@class=‘snowplow-author-email-addresses’]/text()")

保存结果即可。
附结果如下:
Self-Driven Desalination and Advanced Treatment of Wastewater in a Modularized Filtration Air Cathode Microbial Desalination Cell
main init
, ,

Csv:
从Web of Science 爬取文章作者邮箱小记_第8张图片

附完整代码:
注意:大部分代码来自于博客《Web of Science爬虫实战(Post方法)》(https://blog.csdn.net/jgzquanquan/article/details/78827413)

import re

from multiprocessing import Process
from multiprocessing import Manager
import requests
import time
import xlrd
from bs4 import BeautifulSoup
from lxml import etree
 
class SpiderMain(object):
    def __init__(self, sid, kanming):
        print(kanming)
        self.hearders = {
            'Origin': 'https://apps.webofknowledge.com',
            'Referer': 'https://apps.webofknowledge.com/UA_GeneralSearch_input.do?product=UA&search_mode=GeneralSearch&SID=R1ZsJrXOFAcTqsL6uqh&preferencesSaved=',
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36",
            'Content-Type': 'application/x-www-form-urlencoded'
        }
        self.form_data = {
            'fieldCount': 1,
            'action': 'search',
            'product': 'WOS',
            'search_mode': 'GeneralSearch',
            'SID': sid,
            'max_field_count': 25,
            'formUpdated': 'true',
            'value(input1)': kanming,
            'value(select1)': 'TS',
            'value(hidInput1)': '',
            'limitStatus': 'collapsed',
            'ss_lemmatization': 'On',
            'ss_spellchecking': 'Suggest',
            'SinceLastVisit_UTC': '',
            'SinceLastVisit_DATE': '',
            'period': 'Range Selection',
            'range': 'ALL',
            'startYear': '1985',
            'endYear': '2019',
            'update_back2search_link_param': 'yes',
            'ssStatus': 'display:none',
            'ss_showsuggestions': 'ON',
            'ss_query_language': 'auto',
            'ss_numDefaultGeneralSearchFields': 1,
            'rs_sort_by': 'PY.D;LD.D;SO.A;VL.D;PG.A;AU.A'
        }
        self.form_data2 = {
            'product': 'WOS',
            'prev_search_mode': 'CombineSearches',
            'search_mode': 'CombineSearches',
            'SID': sid,
            'action': 'remove',
            'goToPageLoc': 'SearchHistoryTableBanner',
            'currUrl': 'https://apps.webofknowledge.com/WOS_CombineSearches_input.do?SID=' + sid + '&product=WOS&search_mode=CombineSearches',
            'x': 48,
            'y': 9,
            'dSet': 1
        }
        print("main init")
 
    def craw(self, root_url,i):
        try:
            s = requests.Session()
            r = s.post(root_url, data=self.form_data, headers=self.hearders)
            print(r.cookies)
            r.encoding = r.apparent_encoding
            tree = etree.HTML(r.text)
            cited=tree.xpath("//div[@class='search-results']/div[1]/div[3]/div[1]/div/a/@href")
            extraAddress="http://apps.webofknowledge.com"
            extrCited=extraAddress+cited[0]
            extraNewAddress=extrCited.replace("qid=1","qid=1")
            print(extraNewAddress)
            headers1= { 
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',
                'Host': 'apps.webofknowledge.com',
                'Upgrade-Insecure-Requests': '1',
            }
            #extraPage=s1.post(extraNewAddress,headers=headers1)
            #cook={'Cookie':'_abck=A7F930D44A1AF026C075F9A99CD69C7A~0~YAAQHQEPF0a+PnVpAQAAoXH9mAEzuiEnhaXRsXrCR9ESSTYnUVFK4rqVnlLC4WrZgsPgfIwZjAP3Lxor4G+Q42Zo3HzCBFO/HclsHPY81Ni/wRK1c/q07wPXAetdKy36ILbfocVOt9zAtrxU4Ouz4d3XTxBpbPynpzy6GMv4p0R/6sJ1t41631vkLPSsQlwWR2r7i5jC3XfUddLUzGHlxXhYsoMk7RKHihLnwJGlROZd9NX1FRoqDBz+zRFn6xiL0w2BJpvszf0JGl0xS+stlkGwEGg0SRansp97WY2MoEXbkjVpy/bhMufmQygUUS8xxg==~-1~-1~-1; SID="6C6aTYEWpCkEnge5Vhl"; CUSTOMER="Harbin Institute of Technology"; E_GROUP_NAME="Harbin Institute of Technology"; dotmatics.elementalKey=SLsLWlMhrHnTjDerSrlG; ak_bmsc=BBAE5EA6D4AFA798839E6AFE7442D6DDB81CDA9D001000007271BE5D317DB564~pl11ISUEBtDHIuThK6/GCw3UXAj57T3oJi9yPhdVvh9Esy5erYJqa6ly1qgaCauiQlIYbD/y4Nx4oiV616jXe3mGtDqajMa2gfDzBvyyA1/hviRXzpt7DsBmjnkBnZgS8UfAK3WxFifyjozwKayxmRvrz5lW2/bapypIoPVFGg3TmAv8wsouOmzC/qyU1/KQtdptD5VEOmHT5kCn7icX84pm6IMEvqvhQEQ/6EM9ZW/2E=; bm_sz=895DC105D2395C4BDF1C5598D824526A~YAAQndocuFuJNyZuAQAAeijrLwVQWiLTECREBfMqtkmMfwSSgAITAgwjDJXQSm7Dd2+Em438tXfvT9MvFMIgxbAriP+DWFffj7h1WKJOUfuXnoQPaIwrvdH6ecY6um4pPEFTBXH8cxPZqePBUp85ksHuF37Uk6bE0v+I5RXpln+Zb+7ySMxz6dxX+AVMLOoRrzGzDsBgVL0=; _sp_ses.630e=*; JSESSIONID=43E79638A407BF40F3E32407BD1A25C1; bm_sv=F8232EFC4977145D429FAF69D3B9B33B~O44K8KhvyPqYzr54ZpVXGpu3/dWgDW1QvS/lpaFBTyxlTM5rwNGtfRTenAtTTjQeagSa7jZ1DKQNxwwAqOK2c2IWHYa6fP8u5O9TDFZXDFSmHjUCNcC11Xx984zq4037FAOvaIRZhsqnJUL01hV0RJomm3pOKNEhkVXhh8dUlpk=; _sp_id.630e=e300f5c6-7915-4bee-8414-0e2af220bdbd.1551543908.31.1572762145.1572750866.b5d66175-470b-4f69-92e6-2b5560bf048c'}
            #extraPage=s.get(extraNewAddress,headers=headers1,cookies=cook)
            extraPage=s.get(extraNewAddress,headers=headers1,cookies=r.cookies)
            print(2)
            #extraPage=requests.get(extraNewAddress)
            extraPage.encoding=extraPage.apparent_encoding
            newTree=etree.HTML(extraPage.text)
            f=open("2.txt","w", encoding='UTF-8')
            f.write(extraPage.text)
            f.close()
            print("close")
            mail=newTree.xpath("//a[@class='snowplow-author-email-addresses']/text()")
            print(mail,extraPage.url)
            #download = tree.xpath(".//div[@class='alum_text']/span/text()")
            flag = 0
            #print(i,cited, download,r.url)
            flag=0
            return mail, flag
            
        except Exception as e:
            if i == 0:
                print(e)
                print(i)
                flag = 1
                mail=-1
                return mail, flag
            else:
                print("error")
                return -1,1
        
 
 
 
 
 
    def delete_history(self):
        murl = 'https://apps.webofknowledge.com/WOS_CombineSearches.do'
        s = requests.Session()
        s.post(murl, data=self.form_data2, headers=self.hearders)
 
 
 
 
 
root_url = 'https://apps.webofknowledge.com/WOS_GeneralSearch.do'
 
if __name__ == "__main__":
    # sid='6AYLQ8ZFGGVXDTaCTV9'
 
    root = 'http://www.webofknowledge.com/'
    #s = requests.get(root)
    #sid = re.findall(r'SID=\w+&', s.url)[0].replace('SID=', '').replace('&', '')
    #print(sid)
    #kanming="Cell"
    print("if")

   

    data = xlrd.open_workbook('1.xlsx')
    table = data.sheets()[0]#具体是取哪个表格
    nrows = table.nrows
    ncols = table.ncols
    ctype = 1
    xf = 0
    csv = open('1.csv', 'a')
    fail = open('fail.txt', 'a')
    for i in range(0, nrows):
        
        if i % 100 == 0:
            # 每一百次更换sid
            s = requests.get(root)
            sid = re.findall(r'SID=\w+&', s.url)[0].replace('SID=', '').replace('&', '')
        kanming = table.cell(i, 0).value
        obj_spider = SpiderMain(sid, kanming)
        mail,flag = obj_spider.craw(root_url,i)
        if flag==1:
            fail.write(str(i)+'\n')
        else:
            if len(mail)==0:
                mail.append(0)
                print(mail)
            
        csv.write(str(mail)+  ',' + '\n')
    csv.close()   

你可能感兴趣的:(从Web of Science 爬取文章作者邮箱小记)