scrapy基本使用
Scrapy笔记
安装scrapy框架
安装
scrapy
: 通过pip install scrapy
如果是在Windows上面,还需要安装
pypiwin32
,如果不安装,那么以后运行scrapy项目的时候会报错。安装方式:pip install pypiwin32
。如果是在Ubuntu下,还需要安装一些第三方库:`sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev`
创建爬虫
创建项目:
scrapy startproject <spider_name>
创建爬虫:cd到项目所在的路径,创建爬虫,执行命令
scrapy genspider [spider_name] [spider_domains]
注意!爬虫名字不能和项目名字相同
项目目录结构
items.py: 用来从存放爬虫爬取下来的模型,也就是定义需要爬取的数据字段
middlewares.py: 用来存放各种中间件的地方
pipelines.py: 存储items模型数据的,比如存到磁盘,或者写入数据库
spiders: 存放爬虫文件
settings.py: 爬虫的一些配置信息(比如请求头,多久发送一次请求,ip代理池等)
scrapy.cfg: 项目的配置文件
运行爬虫
scrapy crawl [spider_name]
每次运行的时候都要到终端去执行,这样在调试的时候不太方便;这项目下创建一个文件
run_spider.py
文件,这里面写上:
from scrapy import cmdline
# cmdline.execute('scrapy crawl [spider_name]'.split()) # 运行的命令是一个切割的列表
# 等价于
cmdline.execute(['scrapy', 'crawl', '[spider_name]'])
Spider下的爬虫文件
在使用`scrapy genspider <spider_name> <spider_domains> 创建好一个爬虫文件后,爬虫文件如下:
# -*- coding: utf-8 -*-
import scrapy
class TestSpider(scrapy.Spider):
name = 'test' # 爬虫名字 [scrapy crawl test] 此命令运行爬虫
allowed_domains = ['www.baidu.com'] # 运行爬虫爬取的范围
start_urls = ['http://www.baidu.com'] # 爬虫最开始爬取的url
def parse(self, response):
print(response) # 接收到的response响应对象
print(response.body) # 二进制数据,对应request的response.content
print(response.text) # 文本数据,对应request的response.text
pass
自动帮我们定义了一个TestSpider类,继承自scrapy.Spider类
name
: 爬虫运行时的名字scrapy crawl name
allwoed_domains
允许爬去的范围,scrapy运行的速度太快,防止爬到别的网站去,定义了此爬虫只能在这个域名下面爬取数据start_urls: 是一个列表,爬虫最开始爬取的url
parse方法: 当爬虫从互联网上请求到数据之后,返回的响应数据会默认调用这个方法来解析,参数
response
就是接收到的响应response.text 返回文本数据,解码好的文本
response.body 返回网页二级制数据,需要我们手动指定编码
response可以调用的解析方法
xpath: response可以直接调用xpath来来解析数据返回一个selector对象
print(resposne.xpath('//title/text'))
# 返回一个xpath的selector对象
[<Selector xpath='//title/text()' data='百度一下,你就知道'>]
# 我们需要从这个selector对象中取出数据时,使用extract()提取全部文本内容,等价与getall()
# extract_first()提取一个文本内容,等价于get()
parse
方法名不能更改,这是默认的start_url请求默认的回调函数,返回的响应会调用这个函数来解析,没有会报错
items.py文件
定义我们需要爬取的字段信息,可以理解为字典,用法和字典是一样的
import scrapy
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
baidu_title = scrapy.Field() # 定义爬取的字段
使用items:在爬虫文件中
from ..items import MyspiderItem
# -*- coding: utf-8 -*-
import scrapy
from ..items import MyspiderItem
class TestSpider(scrapy.Spider):
name = 'test'
# allowed_domains = ['www.baidu.com']
start_urls = ['http://www.baidu.com']
def parse(self, response):
items = MyspiderItem() # 实例化items,items的使用方法和字典的使用方法是一样的
items['baidu_title'] = response.xpath('//title/text()').extract_first()
注意,当我们在items文件中定义了需要爬取的字段后,在实例化使用items时,如果使用的字段
在items中没有定义,就会报错
pipelines.py 文件
管道文件,用于处理Spider返回的数据,保存到本地或者数据库等
class MyspiderPipeline(object):
def open_spider(self, spider): # 爬虫打开的时候执行,Spider就是你所编写的爬虫类
pass
def process_item(self, item, spider): # 处理item
return item # 这里的return必须有
def close_spider(self, spider): # 爬虫关闭的时候执行
pass
items怎么返回数据到pipelines中呢?在爬虫文件中yield items就可以了
# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem
class TestSpider(scrapy.Spider):
name = 'test'
# allowed_domains = ['www.baidu.com']
start_urls = ['http://www.baidu.com']
def parse(self, response):
items = MyspiderItem()
items['baidu_title'] = response.xpath('//title/text()').extract_first()
yield items
把返回的item存到本地baidu_test.txt中
class MyspiderPipeline(object):
def open_spider(self, spider): # 爬虫打开的时候执行
self.f = open('baidu_test.txt', 'w', encoding="utf-8") # 在爬虫打开的时候打开一个文件
def process_item(self, item, spider): # 处理item,传递item的时候调用
self.f.write(str(item)) # 返回的item需要转为str,把返回的item写入到文件中
return item
def close_spider(self, spider): # 爬虫关闭的时候执行
self.f.close() # 在爬虫关闭的时候把文件关闭
注意!要使用pipelines,必须在setting中把
ITEM_PIPELINES
打开,就是把前面的注释去掉
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 300,
}
setting.py 文件
BOT_NAME
默认: 'scrapybot'
当您使用 startproject 命令创建项目时其也被自动赋值。
CONCURRENT_ITEMS
默认: 100
Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值。
CONCURRENT_REQUESTS
默认: 16
Scrapy downloader 并发请求(concurrent requests)的最大值。
DEFAULT_REQUEST_HEADERS
默认: 如下
{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
Scrapy HTTP Request使用的默认header。
DEPTH_LIMIT
默认: 0
爬取网站最大允许的深度(depth)值。如果为0,则没有限制。
DOWNLOAD_DELAY
默认: 0
下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数:
DOWNLOAD_DELAY = 0.25 # 250 ms of delay
- 默认情况下,Scrapy在两个请求间不等待一个固定的值, 而是使用0.5到1.5之间的一个随机值 * DOWNLOAD_DELAY 的结果作为等待间隔。
DOWNLOAD_TIMEOUT
默认: 180
下载器超时时间(单位: 秒)。
ITEM_PIPELINES
默认: {}
保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意,不过值(value)习惯设置在0-1000范围内,值越小优先级越高。
ITEM_PIPELINES = {
'mySpider.pipelines.SomethingPipeline': 300,
'mySpider.pipelines.ItcastJsonPipeline': 800,
}
LOG_ENABLED
默认: True
是否启用logging。
LOG_ENCODING
默认: 'utf-8'
logging使用的编码。
LOG_LEVEL
默认: 'DEBUG'
log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG 。
USER_AGENT
默认: "Scrapy/VERSION (+http://scrapy.org)"
爬取的默认User-Agent,除非被覆盖。
PROXIES
: 代理设置示例:
PROXIES = [
{'ip_port': '111.11.228.75:80', 'password': ''},
{'ip_port': '120.198.243.22:80', 'password': ''},
{'ip_port': '111.8.60.9:8123', 'password': ''},
{'ip_port': '101.71.27.120:80', 'password': ''},
{'ip_port': '122.96.59.104:80', 'password': ''},
{'ip_port': '122.224.249.122:8088', 'password':''},
]
COOKIES_ENABLED = False
- 禁用Cookies
目的配置文件,常用的设置可以在里面定义或者设置
实现翻页
匹配到下一页的url,使用
scrapy.Request(url,callback,headers,cookies)
参数url,访问的url
callback 回调函数,会调用哪个函数来处理
后面的headers和cookies等就是你要添加的请求头信息了
实例
import scrapy def parse(self, response):
'''
提取详情页url和下一页url
:param response:
:return:
'''
# 所有详情页的url,返回的是一个selectorList
deatai_urls = response.xpath('//ul[@class="seeWell cf"]/li/a/@href').extract()
for deatai_url in deatai_urls:
yield scrapy.Request(deatai_url, callback=self.parse_detail,headers=headers) next_url = response.xpath('//a[@class="next"]/@href').extract_first()
yield scrapy.Request(next_url, callback=self.parse)
scrapy基本使用的更多相关文章
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- scrapy 知乎用户信息爬虫
zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...
- ubuntu 下安装scrapy
1.把Scrapy签名的GPG密钥添加到APT的钥匙环中: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 6272 ...
- 网络爬虫:使用Scrapy框架编写一个抓取书籍信息的爬虫服务
上周学习了BeautifulSoup的基础知识并用它完成了一个网络爬虫( 使用Beautiful Soup编写一个爬虫 系列随笔汇总 ), BeautifulSoup是一个非常流行的Python网 ...
- Scrapy:为spider指定pipeline
当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...
- scrapy cookies:将cookies保存到文件以及从文件加载cookies
我在使用scrapy模拟登录新浪微博时,想将登录成功后的cookies保存到本地,下次加载它实现直接登录,省去中间一系列的请求和POST等.关于如何从本次请求中获取并在下次请求中附带上cookies的 ...
- Scrapy开发指南
一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy基于事件驱动网络框架 Twis ...
- 利用scrapy和MongoDB来开发一个爬虫
今天我们利用scrapy框架来抓取Stack Overflow里面最新的问题(),并且将这些问题保存到MongoDb当中,直接提供给客户进行查询. 安装 在进行今天的任务之前我们需要安装二个框架,分别 ...
- python3 安装scrapy
twisted(网络异步框架) wget https://pypi.python.org/packages/dc/c0/a0114a6d7fa211c0904b0de931e8cafb5210ad82 ...
随机推荐
- js的回调函数
介绍首先从英文介绍开始 A callback is a function that is passed as an argument to another function and is execut ...
- 第二天:python的函 数、循环和条件、类
https://uqer.io/community/share/54c8af17f9f06c276f651a54 第一天学习了Python的基本操作,以及几种主要的容器类型,今天学习python的函数 ...
- linux-centos系统下安装python3.5.4步骤
查看当前python版本:python -V 查看Python可执行文件位置:which python [root@localhost bin]# which python/usr/bin/pytho ...
- VS2013中调驱动
https://msdn.microsoft.com/en-us/library/windows/hardware/jj200334(v=vs.85).aspx 需要注意的就是 debugport:n ...
- Windows 2008 安装Sql server 2005
Windows 2008 安装Sql server 2005 进入下载的文件中,双击打开:splash.hta 文件进行安装 根据自己的系统来选择性进行安装,这里我们选择第二项:基于 x64 的操作系 ...
- Java之for循环嵌套练习
1.打印4层*** ***** ***** ***** ***** class forfor{ public static void main(String[] args){ for(int y=0; ...
- BPM与OA区别
核心差异: OA解决的是流程有无问题 BPM解决的是流程更好更优的问题 主要差异如下: 1.BPM有更好的广度跟深度 这里的广度是指应用场景的广度. BPM一般都会以端到端的方式衔接企业运营过程的上下 ...
- 浅谈redis的HyperLogLog与布隆过滤器
首先,HyperLogLog与布隆过滤器都是针对大数据统计存储应用场景下的知名算法. HyperLogLog是在大数据的情况下关于数据基数的空间复杂度优化实现,布隆过滤器是在大数据情况下关于检索一个元 ...
- 执行git命令时出现fatal: 'origin' does not appear to be a git repository错误
在执行git pull origin master时出现: fatal: 'origin' does not appear to be a git repository fatal: Could no ...
- 简单的Java ee思维导图