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 nameallwoed_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 ...
随机推荐
- Django数据同步过程中遇到的问题:
1.raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__ve ...
- Excel关联xml文件
1.新建没传值的xml文件,变量名称自己定义好 2.打开excel,如果之前没有设置过,点击选项 如果当前Excel菜单栏中没有开发工具项,在自定义功能区先勾选上开发选项 3.点右下角的xml映射 弹 ...
- Django_简单的数据库交互案例
https://www.jianshu.com/p/bd0af02e59ba 一.页面展示 做一个简单的数据库交换的练习案例 页面.png 二.创建mysql 表 (1)创建django (2)创 ...
- python中的unique()
a = np.unique(A) 对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表 import numpy as np A = [1, ...
- 说一说js中的闭包
不说官方给的定义,感觉自己刚开始看也不是很理解. 闭包 : 其实就是 该函数能使用函数外定义的变量. 为什么要使用闭包? 首先来说一下局部变量和全局变量的危害: 全局变量容易全局污染,局部变量又无法共 ...
- Android四大组件之 --- Service入门
在前面了解了什么是多线程和异步消息处理机制后,我们来看一下到底什么是Service. 1. 什么是service(service的作用)一个服务是一个具有较长生命周期但没有用户界面的程序,例如:一个正 ...
- 常忽略的css技巧
1.利用 CSS 的伪类中的content属性获取attr中的信息 效果图:鼠标放上去出现提示 css代码: .box{position:relative;display:inline-block;m ...
- selenium中iframe的切换
#第一层是默认层, 第二层是新建标签的层,第三层是百度的那层from selenium import webdriverimport timedriver=webdriver.Chrome()driv ...
- .net 服务因为GC时遇到的问题和解决办法
1.问题: .net单一服务中,大量的请求访问后台服务,多线程处理请求,但每个线程都可能出现超时的现象.记录超时日志显示,超时可能在序列化时,Socket异步发送AsyncSend数据时,普通业务处理 ...
- Inside a low budget consumer hardware espionage implant
The following analysis was performed on a S8 data line locator which replied to the hidden SMS comma ...