- 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。
- 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
- 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。
- 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每一个spider负责处理一个特定(或一些)网站。
- 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并通过几个特定的次序处理数据。
- 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工做是处理蜘蛛的响应输入和请求输出。
- 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
- 引擎打开一个网站(open a domain),找处处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
- 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
- 引擎向调度器请求下一个要爬取的URL。
- 调度器返回下一个要爬取的URL给引擎,引擎将URL经过下载中间件(请求(request)方向)转发给下载器(Downloader)。
- 一旦页面下载完毕,下载器生成一个该页面的Response,并将其经过下载中间件(返回(response)方向)发送给引擎。
- 引擎从下载器中接收到Response并经过Spider中间件(输入方向)发送给Spider处理。
- Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
- 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
- (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。
简单examplehtml
1 import scrapy 2 3 from 例子.items import 例子Item 4 5 class 例子Spider(scrapy.Spider): 6 name = "例子" 7 allowed_domains = ["例子.org"] 8 start_urls = [ 9 "例子1", "例子2" 10 ] #此为列表 11 12 def parse(self, response): 13 for sel in response.xpath('xpath代码'): 14 item = 例子Item() 15 item['title'] = sel.xpath('a/text()').extract() 16 item['link'] = sel.xpath('a/@href').extract() 17 item['desc'] = sel.xpath('text()').extract() 18 yield item
制做Scrapy爬虫项目步骤python
1 新建项目shell
startproject 项目名json
2 明确目标(items.py)架构
3 制件爬虫程序并发
进入到spiders文件夹中,执行:app
scrapy genspider 爬虫文件名 "域名"框架
# ex:::: scrapy genspider baiduspaider "www.baidu.comdom
4 处理数据(pipelines.py)scrapy
5 配置settings.py
6 运行爬虫程序
scrapy crawl 爬虫名
scrapy 项目文件详解
文件配置详解
settings.py
USER_AGENT = 'baidu (+http://www.yourdomain.com)'
# 是否遵循robot协议,改成False
ROBOTSTXT_OBEY = False
# 最大并发量 ,默认为16
CONCURRENT_REQUESTS = 32
# 下载延迟时间
DOWNLOAD_DELAY = 3
# 请求报头
DEFAULT_REQUEST_HEADERS = {
'User-Agent':"Mozilla/5.0",
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
# 下载中间件
DOWNLOADER_MIDDLEWARES = {
'baidu.middlewares.BaiduDownloaderMiddleware': 543,
}
# 项目管道
ITEM_PIPELINES = {
'baidu.pipelines.BaiduPipeline': 300, # 此处有优先级
}
def parse(self, response):
#response.xpath('h1') 结果为选择器对象
#[<selector ... data = <h1 class="" >>]
# response.xpath('//h1/text()')结果选择器对象
# [<selector ...data="text()">]
# response.xpath('//h1/text()').extract()
# ['text()']
知识点
1 extract():获取选择器对象中的文本内容
response.xpath('')获得的结果为选择器对象的列表
2 pipellines.py中必须有1个函数叫
def process_item(self,item,spider):
return item [若是有多个piplines的话,须要使用return返回]
3 爬虫程序中,start_urls必须为列表
4 scrapy设置 log :settings.py
LOG_LEVEL = "DEBUG"
5层日志级别
CRITICAL:严重错误
ERROR :通常错误
WARNING:警告信息
DEBUG:调试信息
INFO:通常信息
LOG_FILE ='xx.log' #设置指定log文件
# parse函数是第一次从start_url中初始URL发请求,
# 获得响应后必需要调用的函数
def parse(self,response):
2 如何保存为csv ,或是 json文件
1 scrapy crawl tengxun -o tenxun.csv
2 scrapy crawl tengxun -o tenxun.json
解决导出乱码问题(在settings里面加入一个变量)
FEED_EXPORT_ENCODING = 'utf-8'
3 下载器中间件
1 随机User-Agent
1 settings.py
1 更改settings.py 中更改 USER_AGENT
2 更改settings.py 中更改 DEFALUT_REQUEST_HEADERS ={"":"",}
2 设置中间件[ USER_AGENT] 的更改
1 新建一个useragent.py,存放大量USER_AGENT
2 middleawres.py中写class
3 settings.py中开启 DOWNLOADER_MIDDLEWARES
主要重写
class xxx..DownloaderMiddleware(object):
def process_request(self,request,spider):
request.headers["User-Agent"]=random.choice(USER_AGENT_LIST)
2 设置代理
也是重写
def process_request(self,request,spider):
proxyList=[
"http://1.1.1.1:80",
"http://1.1.1.2:80",
"http://user:password@1.1.1.1:80",
.....
]
# request的meta 参数
request.meta['proxy'] = random.choice(proxyList)
3 图片管道ImagePipeline
1 使用流程(要操做的文件)
1 settings.py
设置图片要保存的路径的变量
IMAGES_STORE ="/home/admin/aaa/images"
2 pipelines.py
1 导入scrapy定义好的图片管道类
from scrapy.pipelines.images import ImagesPipeline
2 定义本身的class,继承scrapy的图片管道类
class xxxImagePipeline(ImagesPipeline):
def get_media_requests(self,item,info):
5 dont_filter参数
scrapy.Request(url,callback=parse,dont_filter=.)
1 False:默认,检查域
2 True:忽略域组检查
6 scrapy shell
1 scrapy shell "http://www.baidu.com"
2 response.txt
7 CrawlSpider类
from scrapy.linkerextractors import LinkExitractor
1 Spider的派生类
Spider类:只爬取start_urls列表中的网页
CrawlSpider类,定义了一些规则(ruler)来提供提取连接,跟进连接,
2 建立CrawlSpider模板爬虫文件
加-t crawl
ex > scrapy genspider -t crrawl tengxun 'xxx.com'
3 示例,从页面中提取全部的连接
1 scrapy shell 'xxx.com'
2 from scrapy.linkerextractors import LinkExtractor # 导入连接规则匹配类,用来提取符合规则的连接
from scrapy.spiders import CrawlSpider,Rule # 导入spiders的派生类CrawlSpider,Rule指定特定操做
3 linkList = LinkExtractor(aallow=("正则"))
4 linkList =extract_links(response)
4 Rule
1 做用:对爬取网站动做指定特色操做
rules = (
Rule(LinkExtractor(allow=r'正则'),
callback = 'parseHtml',
follow=True),)
)
ocr_电子扫描 Ubuntu: sudo apt-get install tesseract-ocr 验证: tesseract test1.jpg test1.txt python 调用 : 须要安装 方法不多,就用1 个,图片转字符串 : image_to_string from PIL_to_string ex::: import pytesseract from PIL import Image image = Image.open('test1.jpg') s= pytesseract.image_to_string(image) print(s)
# 重写spider类的start_request()方法,去掉start_urls def start_requests(self)