class RandomProxiesDownloadmidderware(object):
def __init__(self, proxies):
self.proxies= proxies
@classmethod
def from_crawler(cls, crawler):
proxies= crawler.sittings['PROXIES']
return cls(proxies)
def process_request(self, spider, request):
dict_proxy = random.choice(self.proxies)
REQUEST
url: 就是需要请求,并进行下一步处理的url
callback: 指定该请求返回的Response,由那个函数来处理。
method: 请求一般不需要指定,默认GET方法,可设置为"GET", "POST", "PUT"等,且保证字符串大写
headers: 请求时,包含的头文件。一般不需要。内容一般如下:# 自己写过爬虫的肯定知道Host:media.readthedocs.orgUser-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0Accept: text/css,/;q=0.1Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateReferer:http://scrapy-chs.readthedocs.org/zh_CN/0.24/Cookie: _ga=GA1.2.1612165614.1415584110;Connection: keep-aliveIf-Modified-Since: Mon, 25 Aug 2014 21:59:35 GMTCache-Control: max-age=0
meta: 比较常用,在不同的请求之间传递数据使用的。字典dict型
request_with_cookies = Request(
url="http://www.example.com",
cookies={'currency': 'USD', 'country': 'UY'},
meta={'dont_merge_cookies': True}
)
encoding: 使用默认的 'utf-8' 就行。
dont_filter: 表明该请求不由调度器过滤。这是当你想使用多次执行相同的请求,忽略重复的过滤器。默认为False。
errback: 指定错误处理函数
RESPONSE
status: 响应码
_set_body(body): 响应体
_set_url(url):响应url
self.request= request (request对象)
self.headers= Headers (响应头)
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中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
安装方式 sudo pip3 install scrapy
新建项目
scrapy startproject 爬虫项目名称
进入项目,再次进入项目文件夹,在进入spdeers执行以下命令
scrapy genspider 爬虫文件名称 域名
使用pycharm打开,配置 虚拟环境,配置需要的settings,在爬虫文件中爬取所需要的数据,以及起始的url,在items中定义字段
yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,带有yeild的函数遇到yeild的时候就返回一个迭代值,下次迭代时,代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
scrapy crawl 项目名称启动项目
数据持久化,也就是将爬取到的数据存放到数据库中,一般有mysql mongod redis, 想要存放数据,首先要激活管道文件,在settings中items打开
# 将数据存储在mongodb中
def __init__(self,host,port,dbname,sheetname):
# 创建MONGODB数据库链接
client = pymongo.MongoClient(host=host, port=port)
# 指定数据库
mydb = client[dbname]
# 存放数据的数据库表名
self.mysheet = mydb[sheetname]
@classmethod
def from_crawler(cls, crawler):
host = crawler.settings["MONGODB_HOST"]
port = crawler.settings["MONGODB_PORT"]
dbname = crawler.settings["MONGODB_DBNAME"]
sheetname = crawler.settings["MONGODB_SHEETNAME"]
return cls(host,port,dbname,sheetname)
def process_item(self,item,spider):
data = dict(item)
# mongodb数据插入语句,使用save保存数据的效率会很慢,因为它需要循环便利,操作费时
self.mysheet.insert(data)
return item
通用爬虫
scrapy genspider -t crawl 爬虫文件 域名
rules
CrawlSpider使用rules属性来决定爬虫的爬取规则,并将匹配后的url请求提交给引擎,完成后续的爬取工作。
link_extractor:是一个Link Extractor对象,用于定义需要提取的链接。
callback: 从link_extractor中每获取到链接得到Responses时,会调用参数所指定的值作为回调函数,该回调函数接收一个response作为其一个参数。
follow:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。如果callback为None,follow 默认设置为True ,否则默认为False。
process_links:指定spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。
process_request:指定处理函数,根据该Rule提取到的每个Request时,该函数将会被调用,可以对Request进行处理,该函数必须返回Request或者None
主要参数:
allow:满足括号中“正则表达式”的URL会被提取,如果为空,则全部匹配。
deny:满足括号中“正则表达式”的URL一定不提取(优先级高于allow)。
allow_domains:会提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。
第一步:根据要爬取的网页确定需要保存的字段
第二步:编写爬虫类
LinkExtractor实例对象
LinkExtractor方法中的常用的参数
allow : LinkExtractor对象最重要的参数之一,这是一个正则表达式,必须要匹配这个正则表达式(或正则表达式列表)的URL才会被提取,如果没有给出(或为空), 它会匹配所有的链接。
deny : 用法同allow,只不过与这个正则表达式匹配的URL不会被提取)。它的优先级高于 - allow 的参数,如果没有给出(或None), 将不排除任何链接。
allow_domains:包含了spider允许爬取的域名(domain)列表(list)
deny_domains=():包含了spider不允许爬取的域名(domain)列表(list)
通用爬虫的起始url不会获得响应,如果需要,需要重现def parse_start_url(self, response):方法