mywang88
2018-12-14
简介
由于项目需要,计划抓取 dblp 网站关键词搜索结果的文章列表。
目标站点:dblp: computer science bibliography 以及文章所属期刊网站
维基词条:DBLP - Wkikpedia
1 流程设计
- 从需求方获取“关键词列表”。
- 在 DBLP 主页,使用关键词列表中的每个关键词,发起搜索。
- 获取搜索结果页面中,每个条目(文章)的详细信息,包括文章链接。
- 提取信息,存入数据库文章表。
- 获取文章表中的文章链接,访问文章页面。
- 从文章页面中解析出更多信息,例如 Abstract 等,更新文章信息中的对应字段。
- 由于不同文章往往属于不同站点,需要给每个对应站点编写单独的解析方法。
2 主要工具
-
Python 解释器,版本 3.7.0
-
最好有个 Python 的编辑器(例如 notepad++)或者 IDE(例如 PyCharm)
-
Scrapy 爬虫框架,版本 1.5.1
-
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_request
和parse
等方法。
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 小结
本想写一篇技术文,实现过程中却发现项目太简单,后续工作又太繁琐,先写到这里吧。
好吧,这是一篇科普文。
综上,本文介绍了爬虫项目中的几种常用工具。
整个项目的源代码就不贴了,好多文件的… 有兴趣的小伙伴可以留言。