python(七)爬虫框架
常见的爬虫框架
- Scrapy框架:Scrapy框架是一套比较成熟的Python爬虫框架,是使用Python开发快速,高层次的信息爬取框架,可以高效的爬取web页面并提取出结构化的数据
- PySpider框架:PySpider是以Python脚本为驱动的抓取环模型爬虫框架
- Crawley框架:Crawley也是python开发的框架,该框架致力于改变人们从互联网中提取数据的方式
- Portia框架:Portia框架是一款允许没有任何变成基础的用户可视化地爬取网页的爬虫框架
- Newspaper:Newspaper框架是一款用来提取新闻、文章以及内容分析的Python爬虫框架
Scrapy框架的工作原理
- Scrapy Engin(引擎):Scrapy框架的核心部分。负责在Spider和Item Pipeline、Downloader、Scheduler中间通信、传递数据的
- Spider(爬虫):发送需要爬取的连接给引擎,最后引擎把其他模块请求回来的数据再发给爬虫,爬虫就去解析想要的数据
- Scheduler(调度器):负责接收引擎发送过来的请求,并按照一定的方式进行排列和整理,负责调度请求的顺序等。
- Downloader(下载器):负责接收引擎发送过来的请求,然后去网络上下载对应的数据再交给引擎。
- Item Pipeline(管道):负责将爬虫传递过来的数据进行保存
- Downloader Middlewares(下载中间件):可以扩展下载器和引擎之间通信功能的中间件
- Spider Middlewares(爬虫中间件):可以扩展引擎和爬虫之间通信功能的中间件
scrapy项目
创建项目:语法:scrapy startproject 项目名称 (通过命令创建)
scrapy框架的使用
爬取豆瓣top250图书
项目结构:
- 修改配置文件settings
BOT_NAME = 'douban'
SPIDER_MODULES = ['douban.spiders']
NEWSPIDER_MODULE = 'douban.spiders'
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
}
- 编写items文件
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
publish = scrapy.Field()
score = scrapy.Field()
- 编写爬虫文件 top250book
import scrapy
from bs4 import BeautifulSoup
from ..items import DoubanItem
class DoubanSpider(scrapy.Spider):
name = 'douban' #定义爬虫的名称,启动程序时使用
addowed_domains=['book.douban.com/top250'] # 定义允许爬虫爬取的域名
start_urls = ['https://book.douban.com/top250'] # 定义的起始的网址,告诉爬虫应该从哪个网址开始爬取
# parse是scrapy里默认的处理response(响应)的一个方法
def parse(self, response, **kwargs):
bs = BeautifulSoup(response.text,'html.parser')
tr_tags = bs.find_all('tr',class_='item')
for tr in tr_tags:
item = DoubanItem() # 这个类的对象
title = tr.find_all('a')[1]['title'] # 提取书的名称
publish = tr.find('p',class_='pl').text # 提取出版信息
score = tr.find('span',class_='rating_nums').text # 提取评分信息
item['title'] = title
item['publish'] = publish
item['score'] = score
# print([title,publish,score])
# 数据封装完毕后,需要提交给引擎
yield item
- 编写pipelines文件
from itemadapter import ItemAdapter
import openpyxl
class DoubanPipeline:
def __init__(self):
self.wb = openpyxl.Workbook()
self.ws = self.wb.active
# 添加表头
self.ws.append(['名称','出版信息','评分'])
def process_item(self, item, spider):
# 数据存储操作
line = [item['title'],item['publish'],item['score']]
self.ws.append(line) # 将列表中的数据存储到工作表中
return item
# 定义一个关闭的方法
def close_spider(self,spider):
self.wb.save('book.xlsx')
self.wb.close()
- 编写并运行start文件
from scrapy import cmdline
# cmdline.execute('scrapy crawl douban'.split(' '))
# print('scrapy crawl douban'.split(' '))
cmdline.execute(['scrapy', 'crawl', 'douban'])
- 运行完之后数据会保存到book.xlsx中。如图:
爬取笔趣阁小说
- 分析URL:提取每页中章节小说的URL
- 创建项目
- 修改配置文件settings.py
BOT_NAME = 'story'
SPIDER_MODULES = ['story.spiders']
NEWSPIDER_MODULE = 'story.spiders'
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
DOWNLOAD_DELAY = 1 #下载延迟
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'Cookie': 'fontFamily=null; fontColor=null; fontSize=null; bg=null; UM_distinctid=175b634de922cf-0b54db46c3c024-3e604000-144000-175b634de9343e; Hm_lvt_0684ece53fc1331e366f282d44f9c519=1605079720; ASP.NET_SessionId=j4uj1auhycpqkfe1da5tmfta; bookid=9118; CNZZDATA1278951146=472983357-1605078139-%7C1605083129; booklist=%257B%2522BookId%2522%253A9118%252C%2522ChapterId%2522%253A3329140%252C%2522ChapterName%2522%253A%2522%25u65B0%25u4E66%25u53D1%25u5E03%2522%257D; fikker-KqHJ-Hc8Q=jJJW0OhJR3jSHeBJ0JTUBqnMOKIJDiKW; fikker-KqHJ-Hc8Q=jJJW0OhJR3jSHeBJ0JTUBqnMOKIJDiKW; Hm_lpvt_0684ece53fc1331e366f282d44f9c519=1605087647'
}
ITEM_PIPELINES = {
'story.pipelines.StoryPipeline': 300,
}
- 编写爬虫文件 qustory
import scrapy
class QustorySpider(scrapy.Spider):
name = 'qustory'
allowed_domains = ['qu.la']
# start_urls = ['https://www.qu.la/book/9118/3324988.html']
start_urls = ['https://www.qu.la/book/911