写一个ieee的论文爬虫

我就是我 2023-02-26 04:27 95阅读 0赞

爬取的内容很简单,就是抓取当前期刊页中所有的论文,如红框所示,初始url就是像https://ieeexplore.ieee.org/xpl/conhome/8961330/proceeding 这样子的。

1、研究下网站结构

在这里插入图片描述

emm,还在加载。很明显,下面的数据都是异步加载的。
在这里插入图片描述
F12 ->Network->F5,复制个论文标题关键词全局搜索一下,即可找到对应的文件,我们想要的东西就应该在名为“toc”的这个数据包里了。
在这里插入图片描述
哈哈,论文下载链接啥的果然都在这。
在这里插入图片描述

任务很明确了,就抓这个json文件就行了。等等,url里后面那个数字是什么鬼?
在这里插入图片描述
全局搜一下康康
在这里插入图片描述
看样子这串数字的含义是“issue number”,处于“metadata”这个数据包里
在这里插入图片描述
看一下它的url,嗯,他的url也是很好获取的,那就先抓metadata,再根据其中的issueNumber抓toc数据包
在这里插入图片描述

emmm,还有个问题下面的页码也是异步加载的,找找他在哪。。。
嘶~,难找啊,懒得找了,不找了。后续在页面循环代码里加个异常处理好了。

2、好,思路清晰,目标明确,开搞!

2.1先把issueNumber抓下来

在这里插入图片描述
咦,没东西?加个请求头试试。
经过我不断地尝试在请求头里加入各种东西,发现加入referer这个参数后就能爬出东西来了,看样子这个网站的反爬机制主要是针对盗链恶意访问的。
在这里插入图片描述
好,这样就ok了,再把json字符串转化成字典,就很容易地要找我们的issueNumber参数了。
在这里插入图片描述

2.2抓取论文标题及其链接

有了上面的issueNumber,我们就可以组装这个toc文件的url了。
在这里插入图片描述
嗯,不错,东西都在这了,后面就还是解析json字符串,得到文章标题与下载链接了。
在这里插入图片描述

2.3下载pdf

当然直接下载肯定是不可以的,得需要登录,这里我是校园ip的登陆方式,所以就不用写登陆代码了。

好,直接下载。
在这里插入图片描述
打开瞧瞧,嗯?啥意思啊,不让下?
在这里插入图片描述
把链接粘到浏览器上也能看啊,没问题啊
在这里插入图片描述
嗯?等等,我好像搞错了。这特么是页面链接啊,下载链接那不是在右上角嘛
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4代码整理一下,封装一下,先下载链接

  1. import requests
  2. from lxml import etree
  3. import json
  4. # 输入
  5. conferenceNum = 8961330 #会议编号
  6. # 输出
  7. # 此会议所有文章
  8. # 获取issueNumber
  9. def get_issueNumber(conferenceNum):
  10. conferenceNum = str(conferenceNum)
  11. gheaders = {
  12. 'Referer': 'https://ieeexplore.ieee.org/xpl/conhome/'+conferenceNum+'/proceeding',
  13. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
  14. }
  15. md_url = 'https://ieeexplore.ieee.org/rest/publication/home/metadata?pubid='+conferenceNum
  16. md_res = requests.get(md_url, headers = gheaders)
  17. md_dic = json.loads(md_res.text)
  18. issueNumber = str(md_dic['currentIssue']['issueNumber'])
  19. return issueNumber
  20. # 爬取论文及其下载链接
  21. def get_article_info(conferenceNum, issueNumber):
  22. conferenceNum = str(conferenceNum)
  23. issueNumber = str(issueNumber)
  24. # 将论文名和下载链接存到txt中去
  25. alf = open(r'%s_%s_downloadLinks.txt'%(conferenceNum, issueNumber), 'w')
  26. # 从第一页开始下载
  27. pageNumber = 1
  28. while(True):
  29. toc_url = 'https://ieeexplore.ieee.org/rest/search/pub/'+conferenceNum+'/issue/'+issueNumber+'/toc'
  30. payload = '{"pageNumber":'+str(pageNumber)+',"punumber":"'+conferenceNum+'","isnumber":'+issueNumber+'}'
  31. headers = {
  32. 'Host': 'ieeexplore.ieee.org',
  33. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
  34. 'Referer': 'https://ieeexplore.ieee.org/xpl/conhome/'+conferenceNum+'/proceeding?pageNumber='+str(pageNumber),
  35. }
  36. toc_res = requests.post(toc_url, headers = headers, data=payload)
  37. toc_dic = json.loads(toc_res.text)
  38. try:
  39. articles = toc_dic['records']
  40. except KeyError:
  41. break
  42. else:
  43. for article in articles:
  44. title = article['highlightedTitle']
  45. link = 'https://ieeexplore.ieee.org/stampPDF/getPDF.jsp?tp=&arnumber='+article['articleNumber']+'&ref='
  46. alf.write(title.replace('\n','')+'>_<'+link+'\n')
  47. pageNumber = pageNumber+1
  48. # 停一下防禁ip
  49. import time
  50. time.sleep(1)
  51. alf.close()
  52. return
  53. # start
  54. issueNumber = get_issueNumber(conferenceNum)
  55. get_article_info(conferenceNum, issueNumber)

最后执行结果,一共206条,一条不多一条不少。完全OK
在这里插入图片描述

2.5 后下载论文

链接都摆出来了,下载就简单了。下载代码包装亿点点。

  1. def download_pdf(download_links_file, article_folder):
  2. with open(download_links_file, 'r') as f:
  3. article_download_link_list = f.readlines()
  4. article_download_link_list = [i.strip() for i in article_download_link_list if i is not '\n']
  5. print('共计',len(article_download_link_list), '篇文章。')
  6. a = input('是否立即下载?(是yes/否no):')
  7. if a == 'yes':
  8. import os
  9. if not os.path.exists(article_folder):
  10. os.makedirs(article_folder)
  11. for article_download_link in tqdm(article_download_link_list):
  12. ad = article_download_link.split('>_<')
  13. article_name = ad[0]
  14. # 处理一下article_name,因为windows中不能用\ / : * ? " < > |作为文件名
  15. article_name = re.sub('[\/:*?"<>|]', '_', article_name)#去掉非法字符
  16. article_link = ad[1]
  17. r = requests.get(article_link)
  18. filename = article_folder+'/%s.pdf'%article_name
  19. with open(filename, 'wb+') as f:
  20. f.write(r.content)
  21. # 停一下防禁ip
  22. import time
  23. time.sleep(1)
  24. elif a == 'no':
  25. return
  26. else:
  27. return
  28. download_links_file = '8961330_8970627_downloadLinks.txt'
  29. article_folder = '8961330_8970627_articles'
  30. download_pdf(download_links_file, article_folder)

这里我就懒得下了,206篇太多了,找了个少的期刊下了下,下完后就是这个样子。
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,95人围观)

还没有评论,来说两句吧...

相关阅读

    相关 用python一个爬虫

    可以使用 Python 的第三方库 `requests` 和 `BeautifulSoup` 来编写一个爬虫。 首先,需要安装这两个库,可以使用 `pip` 命令来安装:

    相关 帮我一个论文致谢

    在这里,我非常感谢我的导师XX老师,在我研究的过程中给予我指导和帮助。在此,我还要感谢XX单位的XX老师和XX老师,为我提供了宝贵的意见和建议。同时,我也要感谢我的同学们,在我

    相关 Latex---IEEE论文写作

    本人系宁波大学逻辑综合实验室在读研究生,专业是集成电路工程。使用Latex已经比较熟练,写下这篇博文的初衷一方面是为了自己在以后利用Latex写作时方便查找,另一方面也是给自己