-
新建爬虫方式:
1.创建scrapy工程:scrapy startproject projectName
2.cd projectName
3.创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com
如本例中:
scrapy startproject scrapyuniversal
cd scrapyuniversal
scrapy genspider -t crawl universal tech.china.com
本例中爬取的是链接是:http://tech.china.com/articles
可以参考下面urls.py文件 -
新建通用配置文件:
在项目scrapyuniversal目录下,新建一个configs目录,跟spiders目录同级.
新建一个json文件,本例中命名为 china.json
可以参考链接获取chian.json文件: https://blog.csdn.net/ding283595861/article/details/101343249 -
新建爬取规则rules, 放在scrapyuniversal目录下,文件命名为: rules.py
具体实现如下:
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule
#爬取规则以及注册解析response callback函数
rules = {
'china':(
Rule(LinkExtractor(allow='article\/.*\.html',restrict_xpaths='//div[@id="left_side"]//div[@class="con_item"]'),callback='parse_item',follow = True),
Rule(LinkExtractor(restrict_xpaths='//div[@id="pageStyle"]//a[contains(.,"下一页")]'),follow = True)
)
}
- 新建提取url通用文件,放在scrapyuniversal目录下,命名为urls.py
具体的实现如下:
#获取url链接
def china1(start,end):
for page in range(start,end+1):
yield 'http://tech.china.com/articles/index_'+str(page)+'.html'
- 新建获取通用配置json文件,放在scrapyuniversal目录下,命名为utils.py
具体实现如下:
from os.path import realpath,dirname
import json
#获取通用配置json文件.
def get_config(name):
path = dirname(realpath(__file__))+ '/configs/' +name + '.json'
print("path:%s"%path)
with open(path,'r',encoding='utf-8') as f:
return json.loads(f.read())
- 具体爬虫文件: universal.py 可以参考https://blog.csdn.net/ding283595861/article/details/101343391
- 新建item字段:items.py
具体实现如下:
import scrapy
class ScrapyuniversalItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
class NewsItem(scrapy.Item):
title = scrapy.Field()
url = scrapy.Field()
text = scrapy.Field()
datetime = scrapy.Field()
source = scrapy.Field()
website = scrapy.Field()
- 在scrapyuniversal目录上一级目录下,新建一个执行的文件,run.py
具体的实现如下:
import sys
from scrapy.utils.project import get_project_settings
from scrapyuniversal.spiders.universal import UniversalSpider
from scrapyuniversal.utils import get_config
from scrapy.crawler import CrawlerProcess
def run():
#该参数指定为configs中china.json文件名字(china)
name = sys.argv[1]
custom_settings = get_config(name)
spider = custom_settings.get('spider','universal')
project_settings = get_project_settings()
settings = dict(project_settings.copy())
settings.update(custom_settings.get('settings'))
process = CrawlerProcess(settings)
process.crawl(spider,**{'name':name})
process.start()
if __name__ == '__main__':
run()
进入到scrapyuniversal目录下,执行
python run.py china
china就是对应的configs配置下的china.json文件.
通用配置的好处就是爬虫文件是固定的,不用每次都改变,用户如果想爬取其他网站,可以 做以下几点修改:
A: 重新配置一个 ***.json文件
B:在rules.py中,新建一个提取规则
C:在urls.py中,新建一个获取链接的函数
D:在items.py 中新建一个类,定义想要爬取的各个字段信息
然后运行 :
python run.py 配置文件名字
这样的好处,用户提取不同的网站信息,只需要关心爬取规则方法,不需要另处理爬虫文件了。