工作上需要爬取 wos 的一些专利号和施引专利,做成了一个 excel 表格。施引专利在系统默认的导出里是没有的。
第一次实际运用了concurrent.futures 来处理并发下载,确实很简单。一开始用 scrapy 框架貌似连接非常慢,不知道什么原理,三次连接两次超时,于是手写了一个用很多 try/except 结构的 spider 。

Github: wos_spider

一定要记得写日志和异常处理!!!!

全文基本上没有很难的地方,主要是坑

  • wos有时候会返回一个加载的页面,也怀疑是请求超时导致的,这时候需要重复 requests.get()
  • 解析施引专利的时候会根据情况遇到两种xpath,都需要考虑
  • 不需要考虑对文件加锁,并发下载本来就不应该使用同一个文件指针,如果一定要用就在线程结束的时候写入,而不是考虑阻塞线程。

伪代码:

zlh: 专利号
syzl: 施引专利
def main_crawl():构造page的urlfor 每个 page:下载页面解析专利号if 专利号没有完全显示:获取专利号详情页链接zlh_crawl()解析施引专利储存到临时列表将临时列表写入文件def zlh_crawl():下载专利号详情页解析专利号

wos_spider.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
zlh: 专利号
syzl: 施引专利用concurrent.futures 处理并发,第一个参数为调用对象(函数),第二个参数为可迭代对象
'''import requests
from lxml import etree
from concurrent import futures
import time
from datetime import datetimedef main_crawl(page):sid = '6AYdysu8mvLaGzw8Exb'url = "http://apps.webofknowledge.com/summary.do"querystring = {"product": "DIIDW", "colName": "DIIDW", "qid": "5", "SID": sid,"search_mode": "GeneralSearch", "formValue(summary_mode)": "GeneralSearch","update_back2search_link_param": "yes", "page": page, "isCRHidden": "true"}headers = {'cache-control': "no-cache",}# 初始化错误信息error_page = pageerror = False_file = []s = requests.Session()try:r = s.request("GET", url, headers=headers, params=querystring)r.encoding = r.apparent_encodingtree = etree.HTML(r.text)max_index = 51# 最后一页只有41项if page == 292:max_index = 41for recode_num in range(1, max_index):# 构造 recode_num# 开始解析专利号num = (page - 1) * 50 + recode_numzlh_xpath = '//*[@id="RECORD_' + str(num) + '"]/div[3]/text()'# //*[@id="RECORD_51"]/div[3]/text()# //*[@id="RECORD_14551"]/div[3]/text()# 如果页面出错,重复请求while (True):try:zlh = tree.xpath(zlh_xpath)[0]breakexcept:r = s.request("GET", url, headers=headers,params=querystring)r.encoding = r.apparent_encodingtree = etree.HTML(r.text)# 如果最后一项是 . 进入该专利详情进行爬取if zlh[-1] == '.':item_url_xpath = '//*[@id="RECORD_' + \str(num) + '"]/div[3]/div[2]/div/a/@href'item_url = 'http://apps.webofknowledge.com' + \tree.xpath(item_url_xpath)[0]zlh = zlh_crawl(s, item_url) # 进入详情页# 开始解析施引专利,有两种情况,用 try结构try:syzl_num_xpath = '//*[@id="RECORD_' + \str(num) + '"]/div[3]/div[1]/value/text()'# //*[@id="RECORD_101"]/div[3]/div[1]/valuesyzl_num = tree.xpath(syzl_num_xpath)[0]except:syzl_num_xpath = '//*[@id="RECORD_' + \str(num) + '"]/div[3]/div[1]/a/value/text()'# //*[@id="RECORD_101"]/div[3]/div[1]/a/valuesyzl_num = tree.xpath(syzl_num_xpath)[0]finally:print(zlh + ' ' + syzl_num)_file.append(zlh + ' ' + syzl_num) # 保存该页面的各项信息print(_file)except e:# 处理报错信息error_num = numerror = Truefinally:with open('wos2.txt', 'a', encoding='utf-8') as file:for i in _file:file.write('{}\n'.format(i)) # 保存该页面的各项信息if error is True:with open('log.txt', 'a', encoding='utf-8') as e:e.write('page {} find error,error_num is {}.Time is {}\n'.format(error_page, error_num,datetime.now().strftime('%b-%d-%Y %H:%M:%S')))def zlh_crawl(s, url):zlh_response = s.get(url)zlh_response.encoding = zlh_response.apparent_encodingtree = etree.HTML(zlh_response.text)zlh_xpath = '//*[@id="FullRecDataTable"]/tr[2]/td/text()'zlh_list = tree.xpath(zlh_xpath)zlh = ''for i in zlh_list:zlh += ireturn zlhif __name__ == '__main__':t1 = time.time() # 开始时间with futures.ThreadPoolExecutor(max_workers=4) as e:e.map(main_crawl, range(1, 293)) # 类似 map 用法t2 = time.time() # 结束时间# 打印日志with open('log.txt', 'a', encoding='utf-8') as l:l.write('spider cost {}s.Time is {}.\n'.format(t2 - t1, datetime.now().strftime('%b-%d-%Y %H:%M:%S')))

txt2excel.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-'''
xlwt:创建excel的库
sheet.write(行坐标,列坐标,字符串等)
读取txt文件的每一行,每行字符串用空格划分
最后一项为施引专利储存在第2列
其余为专利号放第一列
'''
import xlwtif __name__ == '__main__':wbk = xlwt.Workbook() # 创建文件sheet = wbk.add_sheet('sheet1')sheet.write(0,0,'专利号')sheet.write(0,1,'施引专利')row = 1with open('./wos_test.txt', 'r') as file:for i in file.readlines(): # 读取每一行lst = i.split() # 用空格划分s = ''for i in range(len(lst)-1): # 除最后一列s += str(lst[i])sheet.write(row, 0, s)sheet.write(row, 1, lst[-1])row += 1 # 行坐标+1wbk.save('wos.xls')

log.txt

spider cost 866.1539652347565s.Time is Oct-06-2018 16:05:20.
spider cost 12755.609891653061s.Time is Oct-06-2018 19:52:53.

concurrent.futures 并发爬取 wos 的部分专利号和施引专利相关推荐

  1. python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘

    之前文章中所介绍的爬虫都是对单个URL进行解析和爬取,url数量少不费时,但是如果我们需要爬取的网页url有成千上万或者更多,那怎么办? 使用for循环对所有的url进行遍历访问? 嗯,想法很好,但是 ...

  2. Laravel中curl_multi并发爬取百度关键词排名

    Laravel中curl_multi并发爬取百度关键词排名 框架使用的Laravel Linux中crontab定时任务添加 */1 * * * * /data/wwwroot/default/new ...

  3. java并发爬取 腾讯应用宝 里的数据 (含有源码下载)

    今天想要做的是把应用宝网站数据爬取下来. 知识要点 解析html 解析json 线程池执行 爬取步骤 左边一栏是分类,右边是应用app数据. 首先解析左边一栏的数据,在html中class为menu- ...

  4. 4ye含泪用python爬取了自己的公众号粉丝数据

    4ye含泪用python爬取了自己的公众号粉丝数据 小伙伴们好呀,最近本来是在捣鼓Gateway的知识点的,结果被一件事情搞得心不在焉 哈哈哈哈,结果不得不先鸽下~ 搞完这件事情再继续哦!! ε=ε= ...

  5. python爬取快手评论信息+快手号

    python爬取快手评论信息+快手号 潦草记录一下思路 从浏览器进行抓包,分析提交参数, 1.从手机中打开快手,找到需要爬取的视频,转发复制链接,从网页中打开 2.按F12进入开发者模式,进行抓包 3 ...

  6. scrapy中集成selenium+浏览器池实现selenium的并发爬取LCSC网站中非结构化表格数据+异步存储进mysql+完整代码

    爬取https://lcsc.com/products/Connectors_365.html这个网址下所有的表格数据. 蓝色的都是要爬取的子页面,要爬取子页面里面的表格数据 ,表格数据如下: 右上角 ...

  7. python自动爬取WOS(web of science)文献引用信息及作者h索引

    背景 前段时间导师有个小目标,把实验室发的文章汇总一下,看看都被谁引用过,其中哪些是大牛,跳出来,给脸上贴金,于是催生了这样一个需求: 需求 查找实验室发的文献信息,爬下来 每一篇文献的所有施引文献信 ...

  8. 从资源爬取到个人微信公众号开发:使用 Python 打造公众号电影搜索器

    Python 网络爬虫的教程现在可谓是满天飞,只要是个接受过通识教育的人,学习一下上手简单的 Python 编程语言,就能够写出一个简单的爬虫来,但是如何将爬虫爬取的数据用起来似乎很多人并没有过多的考 ...

  9. Python爬取网站用户手机号_用Python爬虫爬取学校网妹子QQ号,100行代码撩妹,用技术脱单...

    前言: 其实这个项目没什么难度,稍微懂一点爬虫的人或者是已经就业的程序员都可以用自己学的编程语言写出来,但是正是这也原因,也间接证明现在网络很多安全问题的存在,简单的说就是这个网站的程序员偷懒,让用户 ...

最新文章

  1. 多版本Python共存时pip给指定版本的python安装package的方法
  2. tensorflow.transpose的理解
  3. 【第六期】拿不到offer全额退款 人工智能工程师培养计划招生
  4. 计算机导论与计算机组成原理关系,计算机组成原理
  5. 如何配置MySQL?(三)
  6. java线程主要状态及转换_Java线程状态转换及控制
  7. Oracle里PO自动售货如何做,Oracle R12采办接收流程(PR-PO-RCV-AP-Payment)
  8. java12章_从零开始学Java 第12章 异常处理
  9. SAP MM 采购订单收货被取消了还是不能增加新的delivery cost!
  10. 谈论源码_当我们谈论开放音乐时,我们指的是什么?
  11. 网络分裂(network partition)
  12. mysql让数据-1_[1]mysql-对数据基本操作
  13. PyTorch基础(六)迁移学习
  14. html百度地图导航起点默认定位位置,百度地图如何设置起点
  15. 抖音订单捉取-php
  16. LA 4670 Dominating Patterns AC自动机简单题
  17. MacBook将大文件分割成很多个小文件split命
  18. php.ini error reporting,解决PHP.ini中的error_reporting不起作用
  19. microsoftfixitoffice官方清理软件_电脑卡?试试这几款电脑必备清理优化软件
  20. 对比测评3款BI分析⼯具,还是它最香!

热门文章

  1. 没事来冒个泡(java之冒泡)
  2. IOS 之 NSArray 数组方法详解(3)
  3. 低通信道与带通信道的区别
  4. 基于C#开发人脸识别,人脸捕捉,活体检测,图像识别
  5. 2018传智播客黑马python视频教程15期
  6. 网站白名单,ip白名单
  7. 详细的easyExcel填充数据填充图片及导出示例
  8. pygame自制小游戏
  9. myeclipse 9.0正式版,提供个可下载的网址(附激活方法+汉化包),MyEclipse官方网站打不开(解决办法)
  10. 申请QQ密码保护,保护号码安全!(转)