本文以第一范文网(https://www.diyifanwen.com/)为例,介绍爬虫入门基础知识。。随着人工智能的不断发展,爬虫这门技术也越来越重要,很多人都开启了学习爬虫的道路,本文介绍了利用scrapy爬虫学习的一些基础知识以及代码示例。
Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。
Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。
Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler 中间的通讯,信号、数据传递等。
Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件。
Gerapy 是一款 分布式爬虫管理框架,支持 Python 3,基于 Scrapy开发,Gerapy 可以帮助我们:更方便地控制爬虫运行,更直观地查看爬虫状态,更实时地查看爬取结果,更简单地实现项目部署,更统一地实现主机管理。
打开cmd命令行,输入如下代码下载2.6.1版本。
pip install scrapy==2.6.1
(如果下载版本过高可能会版本不匹配。)
在桌面新建文件夹,在该文件夹目录下进入cmd,输入如下代码:
scrapy startproject NewsData
出现如下所示代码证明创建成功。
此时该文件夹下会出现NewsData的文件夹
进入目录:爬虫\NewsData\NewsData,可以看到四个配置文件,分别是items,middlewares,piplines和settings,接下来我们就可以开始scrapy框架的配置。(小编用的是pycharm,看个人习惯,别的也可以。)
定义要存入数据库的抓取内容:
import scrapy
class NewsdataItem(scrapy.Item):
title = scrapy.Field() # 文章标题
url = scrapy.Field() # 文章链接
date = scrapy.Field() # 发布日期
content = scrapy.Field() # 文章正文
student_id = scrapy.Field() # 学生学号
site = scrapy.Field() # 站点
添加header
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
from scrapy.utils.project import get_project_settings
import random # 一定别忘了引入random
settings = get_project_settings()
class RotateUserAgentMiddleware(UserAgentMiddleware):
def process_request(self, request, spider):
referer = request.url
if referer:
request.headers["referer"] = referer
USER_AGENT_LIST = settings.get('USER_AGENT_LIST')
user_agent = random.choice(USER_AGENT_LIST)
if user_agent:
request.headers.setdefault('user-Agent', user_agent)
print(f"user-Agent:{user_agent}")
(1)导入pymongo包和加载设置:
import pymongo
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
(2)创建mongodb数据库的链接:
class NewsdataPipeline:
# class中全部替换
def __init__(self):
host = settings["MONGODB_HOST"]
port = settings["MONGODB_PORT"]
dbname = settings["MONGODB_DATABASE"]
sheetname = settings["MONGODB_TABLE"]
# username = settings["MONGODB_USER"] # monggodb没有密码的情况下就把这两行注释掉即可
# password = settings["MONGODB_PASSWORD"]
# 创建MONGODB数据库链接
# client = pymongo.MongoClient(host=host, port=port, username=username, password=password)
client = pymongo.MongoClient(host=host, port=port) # 没有密码的时候
# 指定数据库
mydb = client[dbname]
# 存放数据的数据库表名
self.post = mydb[sheetname]
def process_item(self, item, spider):
data = dict(item)
# 数据写入
self.post.insert_one(data) # insert()/insert_one()适用于高版本python
return item
(1)将机器人协议的True改为False,有些站点不允许机器人爬取(一定要改,有些网站无法爬取的原因可能就是这个):
ROBOTSTXT_OBEY = False # 不遵守机器人协议,有一些站点不允许机器人爬取,改成false即可爬取
(2)将DOWNLOADER_MIDDLEWARES注释解开加入中间件:
DOWNLOADER_MIDDLEWARES = {
'NewsData.middlewares.RotateUserAgentMiddleware': 543,
}
(3)将ITEM_PIPELINES 注释解开用来执行pipelines函数:
ITEM_PIPELINES = {
'NewsData.pipelines.NewsdataPipeline': 300,
}
(4)添加USER_AGENT_LIST
USER_AGENT_LIST = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3"
]
(5)添加MONGODB数仓设置
根据自己的数据库情况设置:
MONGODB_HOST = "localhost" # 数仓IP
MONGODB_PORT = 27017 # 数仓端口号
MONGODB_DATABASE = "NewsData" # 数仓数据库
MONGODB_TABLE = "News_Process_D" # 数仓数据表单
在NewsData目录下进入终端,输入
scrapy genspider news " "
news 为文件名称
“ “ 为目标引用的作用域,此处没有定义,默认全域。
创建成功后会在spiders文件下看到一个名为news的文件,这就是我们新建的爬虫文件,用pycharm打开进行编辑。
代码如下:
import scrapy
from NewsData.items import NewsdataItem
class NewsSpider(scrapy.Spider):
name = 'news'
allowed_domains = [] # 作用域
start_urls = [
'https://www.diyifanwen.com/zuowen/gaozhongyilunwenzuowen/',
'https://www.diyifanwen.com/zuowen/gaozhongshuomingwenzuowen/',
'https://www.diyifanwen.com/zuowen/gaozhongyingyongwen-shenqingshu/',
'https://www.diyifanwen.com/zuowen/gaozhongyingyongwen-duhougan/',
'https://www.diyifanwen.com/zuowen/gaozhongyingyongwen-yanjianggao/',
'https://www.diyifanwen.com/zuowen/gaozhongqitayingyongwen/',
'https://www.diyifanwen.com/zuowen/gaokaozuowenshangxi/',
'https://www.diyifanwen.com/zuowen/gaozhonghuatizuowen/',
'https://www.diyifanwen.com/zuowen/gaokaolingfenzuowen/',
'https://www.diyifanwen.com/zuowen/gaozhongzuowen/gkzwzd/',
'https://www.diyifanwen.com/zuowen/gaosanxushisanwen/',
'https://www.diyifanwen.com/zuowen/gaoyiyingyongwen/',
'https://www.diyifanwen.com/zuowen/gaokaozuowenyuce/',
]
def start_request(self):
for url in self.start_urls:
#item = NewsdataItem()
#item["site"] = url[1]
#item["item"] = url[2](若用字典形式,把这两行解开)
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
title_list = response.xpath(
'//*[@id="AListBox"]/ul/li/a/text()').extract() # 如果最后是extract_first()就是匹配的第一个选项
url_list = response.xpath(
'//*[@id="AListBox"]/ul/li/a/@href').extract()
# //*用于匹配所有符合要求的节点 //匹配子孙节点 /用于获取直接子节点
# print(url_list) 此处为调试。
for each in range(len(title_list)):
item = NewsdataItem()
# item = response.meta["item"]
item["title"] = title_list[each]
item["url"] = "http:" + url_list[each]
item["student_id"] = '20201936'
item["site"] = '第一范文网'
yield scrapy.Request(url=item["url"], meta={"item": item}, callback=self.parse_detail)
def parse_detail(self, response):
item = response.meta["item"]
item["content"] = response.xpath('//*[@id="ArtContent"]/p/text()').extract()
item["date"] = response.xpath('//*[@id="artinfo"]/span[@class="time"]/text()').extract()
return item
在终端中输入
scrapy crawl news
最后的news为你命名的python文件名
首先打开命令行,输入如下代码下载所需包:
pip install gerapy==0.9.11
pip install scrapyd
(1)初始化项目
gerapy init
执行完该命令之后会在当前目录下生成一个gerapy文件夹,进入该文件夹,会找到一个名为projects的文件夹 ,如图:
(2)进入gerapy目录下,输入如下代码:
gerapy migrate
(3)初始化超级用户 ,输入代码:
gerapy initadmin
记住用户名和密码,一般默认都是admin / password:admin
(4)启动服务,输入用户名密码
gerapy runserver 0.0.0.0:8000
(5)编辑主机管理
记得开启scrapyd服务,不然无法连接
连接成功后如图
(6)编辑项目管理:添加对应描述,然后点击打包,点击部署。
(7)编辑任务管理:根据自己的需要设置时间,或者时间间隔,小编这里设置的时间间隔为1分钟为例(为了快速看运行情况)。
ps:目前版本还没有北京时间,推荐使用Hong_Kong时间
查看任务状态,可以看到,已经成功了两次。
Gerapy 与 scrapyd 关联
我们仅使用scrapyd是可以调用scrapy进行爬虫的。 而使用Greapy是为了将使用命令行开启爬虫变成鼠标直接点击就可以实现。 在gerapy中配置了scrapyd后,不需要使用命令行,就可以通过图形化界面直接开启爬虫.
总结:
学习爬虫并不难,要有耐心,并且勤于练习, 还要养成记笔记的好习惯。熟能生巧,希望以上的范例可以对大家的爬虫入门有所帮助!