python 3.6.9
8.0.20 MySQL Community Server - GPL
other python packages in requirements.txt
.
├── data_crawler
│ ├── fake_agents.json
│ ├── __init__.py
│ ├── items.py # 用与定义所爬下数据的结构
│ ├── middlewares.py # 中间件
│ ├── pipelines.py # pipelines,用于数据的清理、保存
│ ├── settings.py # scrapy项目配置文件
│ └── spiders # 各爬虫
│ ├── acm_spider.py # ACM paper in search result crawler
│ ├── acm_paper_parser.py # 用于处理ACM paper页面的静态方法
│ ├── acm_proceeding_spider.py # ACM proceeding crawler
│ ├── ieee_spider.py # IEEE conferences crawler
│ ├── ieee_author_spider.py
│ ├── ieee_paper_spider.py # IEEE random paper crawler
│ ├── __init__.py
│ └── utils.py # 爬虫所使用的工具
├── fake_agents.json
├── README.md
├── requirements.txt # 配置要求
├── scrapy.cfg
├── scrapy_logs
├── proxies.txt # http代理地址
└── test_files # 暂时存储爬取结果
scrapy crawl ACM_Search
爬取data_crawler/settings.py中ACM_URL中的所有页面。这里要求这些页面是ACM的搜索结果页面。爬虫会爬取搜索出的所有文章的相关信息保存于文件。
scrapy crawl IEEE_Conferences
/data_crawler/settings.py
# conference urls
IEEE_CONF_URLS = ['https://ieeexplore.ieee.org/xpl/conhome/1000064/all-proceedings']
# 需要的年份(including 'from' and 'to')
IEEE_YEAR = {
'from': 2019,
'to': 2019
}
IEEE_CONF_URLS中所有会议在IEEE_YEAR范围内的所有文章
scrapy crawl ACM_Proceedings
/data_crawler/settings.py
ACM_PROCEEDING_URL = ['https://dl.acm.org/doi/proceedings/10.1145/3238147']
可以是多个proceeding
爬取settings中所有proceeding的所有文章
为了节约时间,模拟spider向pipeline发送数据,用于对pipeline的debug。直接读取之前爬取的内容,然后作为item传给pipeline处理。
scrapy crawl debug
在test_files/crawled_items_debug.json中放入之前爬的raw json结果
等于不实际发送请求,而是把之前的结果再次发送给pipeline处理
存储结果保存在 /test_files/crawled_items.json中。其中是没有经过处理的所有spider传回的item
存储于数据库data_processing表中。
如要启动数据库保存,需要在/data_crawler/settings中设置:
-
配置数据库用户名密码等
# Database MYSQL_HOST = 'localhost' MYSQL_DBNAME = 'data_processing' MYSQL_USER = 'root' MYSQL_PASSWORD = 'root' MYSQL_PORT = 3306
-
启动MysqlPipeline(确保'data_crawler.pipelines.MysqlPipeline': 889的最后这个数字不是None)
ITEM_PIPELINES = { 'data_crawler.pipelines.RemoveEmptyItemPipeline': 500, 'data_crawler.pipelines.JsonWriterPipeline': 888 if not DEBUG else None, 'data_crawler.pipelines.MysqlPipeline': 889, }
进入Mysql之后运行 source /absolute/path/data_processing.sql (或者在data_processing根目录下进入mysql,可以写相对路径)
注意此操作会将原名为data_processing的数据库删库
TODO: 目前来看,ieee没有affliation的页面,因此也似乎没有内部id,怎么处理暂时不清楚。暂时用name来作为IEEE affiliation的id
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | id |
ACM_{ACM内部id}或IEEE__{IEEE内部id} | varchar(255) | PRI | NO | ||
2 | name |
varchar(255) | NO | ||||
3 | description |
varchar(4095) | YES |
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | id |
varchar(255) | PRI | NO | |||
2 | name |
varchar(255) | NO | ||||
3 | url |
如果是ACM则有url | varchar(255) | YES |
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | id |
事实上是一个十六进制数, 是将 doi 取其 utf-8 编码的十六进制数字符串 | varchar(255) | PRI | NO | ||
2 | title |
varchar(255) | NO | ||||
3 | abs |
abstract | varchar(4095) | NO | |||
4 | publication_id |
发表的会议的id | varchar(255) | NO | |||
5 | publication_date |
发表年份,事实上和 publication表冗余,但是为了方便还是直接存了 | varchar(255) | NO | |||
6 | link |
事实上是 doi.org/{paper_doi} | varchar(255) | NO | |||
7 | citation |
被引量 | int(11) | NO |
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | id |
ACM_{ACM内部id}或IEEE__{IEEE内部id},如IEEE_37085628262,说明其主页是https://ieeexplore.ieee.org/author/37085628262 | varchar(255) | PRI | NO | ||
2 | name |
varchar(255) | NO |
TODO: 目前不确定是否所有的会议都有doi,如果没有的话考虑通过其他方式存储
TODO: 目前对IEEE的处理是将title作为id保存,目前不确定是否能从 ieee 获得会议doi.
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | id |
会议 id, 可能通过 doi 编码得到, 也可能用内部 id 标识, 需要进一步考虑。注意是具体某一年的会议,比如第34届ASE,不是历年的ASE汇总的(那个可能没有doi) | varchar(255) | PRI | NO | ||
2 | name |
varchar(255) | NO | ||||
3 | publication_date |
发表的年份 | varchar(255) | NO | |||
4 | impact |
影响力因子(TODO:目前不知道怎么获得) | varchar(255) | NO |
注意,这里的reference是所有能够获得doi的文章,其他的reference被忽略;另外很可能这个doi不在爬取的范围内,既在paper表中没有这个rid。
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | pid |
paper id | varchar(255) | PRI | NO | ||
2 | rid |
reference paper id ( doi 对应的编号, 这个id可能不在 paper 表中 )/ | varchar(255) | PRI | NO |
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | pid |
paper id | varchar(255) | PRI | NO | ||
2 | rid |
researcher id | varchar(255) | PRI | NO | ||
3 | order |
第几作者 | varchar(255) | NO |
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | pid |
paper id | varchar(255) | PRI | NO | ||
2 | did |
domain id | varchar(255) | PRI | NO |
代表某学者在某年在某机构发表了文章
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | rid |
researcher id | varchar(255) | PRI | NO | ||
2 | aid |
affiliation id | varchar(255) | PRI | NO | ||
3 | year |
在某年发表了文章 | varchar(255) | PRI | NO |
由于 researcher domain 就是某研究者的所有文章的 domain 的集合,故不在数据爬取时就进行保存这种冗余数据表。
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | rid |
researcher id | varchar(255) | PRI | NO | ||
2 | dname |
domain name | varchar(255) | PRI | NO |
存储暂时只能获得citation的reference,用于之后的进一步爬取
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | id |
自增id,没什么意义,只是由于citation比较长,无法作为key | int | PRI | NO | auto_increment | |
2 | pid |
varchar(255) | NO | ||||
3 | reference_citation |
varchar(4095) | NO |
存储暂时只能获得title的reference(存titile主要是因为IEEE给出的citation很奇怪,还不如title),用于之后的进一步爬取
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | id |
自增id,没什么意义,只是由于title比较长,无法作为key | int | PRI | NO | auto_increment | |
2 | pid |
varchar(255) | NO | ||||
3 | reference_title |
varchar(4095) | NO |
存储暂时只能获得IEEE内部编号的reference,用于之后的进一步爬取
序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 |
---|---|---|---|---|---|---|---|
1 | pid |
varchar(255) | PRI | NO | |||
2 | ieee_document |
varchar(255) | PRI | NO |
log保存在 /scrapy_logs中
在proxies.txt中列出http代理的ip和端口号,自动随机切换代理。
格式为一行一个,ip:端口号
如果不需要代理则在settings中将rotating_proxies.middlewares.RotatingProxyMiddleware、rotating_proxies.middlewares.BanDetectionMiddleware两个中间件禁用