DBLP 搜索爬虫项目

mywang88

2018-12-14

简介

由于项目需要,计划抓取 dblp 网站关键词搜索结果的文章列表。

目标站点:dblp: computer science bibliography 以及文章所属期刊网站

维基词条:DBLP - Wkikpedia

1 流程设计

  • 从需求方获取“关键词列表”。
  • 在 DBLP 主页,使用关键词列表中的每个关键词,发起搜索。
  • 获取搜索结果页面中,每个条目(文章)的详细信息,包括文章链接。
  • 提取信息,存入数据库文章表。
  • 获取文章表中的文章链接,访问文章页面。
  • 从文章页面中解析出更多信息,例如 Abstract 等,更新文章信息中的对应字段。
  • 由于不同文章往往属于不同站点,需要给每个对应站点编写单独的解析方法。

2 主要工具

  • Python 解释器,版本 3.7.0

    官网:https://www.python.org/

  • 最好有个 Python 的编辑器(例如 notepad++)或者 IDE(例如 PyCharm)

  • Scrapy 爬虫框架,版本 1.5.1

    官网:https://scrapy.org/

  • Google Chrome 浏览器,版本 71.0.3578.98(正式版本) (64 位)

  • MySQL 数据库。

  • 其它 Python 工具包,例如 pymysql,json 等。

  • Scrapy 和其它 Python 工具包都可以使用 pip 命令安装。

3 项目实施

3.1 创建爬虫项目

  • 提前安装好 scrapy 框架。
  • 在命令行模式下进入一个准备好的文件夹。
  • 创建一个 scrapy 项目。
scrapy startproject project_name
  • 进入项目文件夹,使用 scrapy genspider 指令创建一个 spider 爬虫。
cd project_name
scrapy genspider dblp domain.com
  • 一个爬虫实际上是一个类,一个 scrapy.spider 类的子类。
  • 在爬虫文件中定义 start_requestparse 等方法。

3.2 获取关键词列表

  • 从需求方获取关键词列表。
  • 本项目中,关键词列表存放于 MySQL 数据库中。
  • Python 的 pymysql 工具包用来与 MySQL 数据库通信。
# 爬虫文件
import scrapy
import pymysql
import json


class DblpSpider(scrapy.Spider):
	name = 'dblp'
    
    def start_request(self):
        # 建立连接
        conn = pymysql.connect(host='192.168.1.8',
                               port=3306,
                               user='mywang88',
                               password='hahahaha',
                               db='dblp')
        cur = conn.cursor()
        # 构造查询语句
        sql = 'SELECT keyword FROM table_name'
        # 执行查询语句
        cur.execute(sql)
        # 提取查询结果
        word_list = list(cur.fetchall())
        # 关闭连接
        conn.close()

3.3 构造搜索结果 url ,提交请求

  • 本项目中,dblp 对于关键词搜索提供了直接将搜索结果导出为 json 格式的服务。
  • 其它类型的搜索,即非关键词搜索,似乎没有这个服务。
  • 关键词对应的 json 数据的 url 是这样构造的:
	for keyword in word_list:
    	# 构造 url
		url = 'https://dblp.uni-trier.de/search/publ/api?q='
		url += keyword[0]
		url += '&h=1000&format=json'
		
		# 创建 scrapy.Request 实例
		req = scrapy.Request(url=url,
		                     callback=self.parse)
		yield req
		# 请求会被提交给 scrapy 框架的请求队列
		# 完成请求会返回一个 scrapy.Response 对象,传递给 parse 函数

3.4 解析搜索结果

  • 向构造的 url 发送 GET 请求,获取响应。
  • 使用 json 工具包来加载响应的 json 数据:
	def parse(self, response):
		result = json.loads(response.text)
		
  • 这是一个字典对象,结果存放在这个路径下:
		tips = result['result']['hits']['hit']
  • 这是一个列表对象,每篇文章对应列表中的一个字典对象。
  • 字典中的'info'字段存放了文章的详细信息。
  • 以篇为单位,将文章详细信息存入 MySQL 数据库中,其中包括文章的 url 。
  • 至此,第一阶段完成。

3.5 后续工作

  • 新创建一个爬虫。
  • SELECT 已经抓取并存入数据库的文章。
  • 通过文章 url 访问文章所属期刊网站上的文章页面。
  • 从文章页面中解析更多文章的详细信息并 UPDATE 数据库。
  • 需要针对每个不同的站点,开发出不同的解析函数(parser)
  • 根据 response.url 的不同,调用不同的解析函数来提取信息。
  • 解析函数中可使用 scc 与 xpath 选择器提高效率。

4 小结

本想写一篇技术文,实现过程中却发现项目太简单,后续工作又太繁琐,先写到这里吧。

好吧,这是一篇科普文。

综上,本文介绍了爬虫项目中的几种常用工具。

整个项目的源代码就不贴了,好多文件的… 有兴趣的小伙伴可以留言。

猜你喜欢

转载自blog.csdn.net/mywang88/article/details/85010022