1、建立一个Scrarrpy爬虫工程
cmd命令提示符中选择目录
输入 scrapy start project name
#工程名不要含中文,否则之后生成爬虫时会报错
生成文件中的scrapy.cfg 部署Scrapy爬虫的配置文件
name/ Scrapy框架的用户自定义Python代码
_ init_.py 初始化脚本
items.py Items代码模板(继承类)
middlewares.cfg Middlewares代码模板(继承类)
pipelines.cfg Pipelines代码模板(继承类)
settings.cfg Scrapy爬虫的配置文件
spiders/ Spiders代码模板目录(继承类)
2、在工程中生成一个Scrapy爬虫
cmd命令提示符中选择建立的爬虫工程目录
输入scrapy genspider demo python123.io
生成文件demo.py
3、配置产生的spider爬虫
4、运行爬虫,爬取网页
cmd命令提示符中输入scrapy crawl desmon
(因为网站拒绝,所以运行失败)
# -*- coding: utf-8 -*-
import scrapy
class DesmonSpider(scrapy.Spider):
name = 'desmon'
allowed_domains = ['pthon123.io'] #访问的域名,只能爬取该域名下的
def start_requests(self):
urls={
'http://pthon123.io/ws/demo.html'} #爬取页面的初始页面
for url in urls:
yield scrapy.Request(url=url,callback=self.parse)
def parse(self, response): #parse()用于处理响应,解析内容形成字典,发现新的URl爬取请求
fname=response.url.split('/')[-1]
with open(fname,'wb') as f:
f.write(response.body)
self.log('Save file %s.'% name)
yield关键字
yield与生成器相关
生成器是一个不断产生值的函数
包含yield语句的函数是一个生成器
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
生成器相比一次列出所有内容的优势
更节省存储空间
响应更迅速
使用更灵活
Scrapy爬虫的基本使用
1、创建一个工程和Spider模板
2、编写Spider
3、编写Item Pipelines
4、优化配置策略
Request类
Request对象表示一个HTTP请求
由Spider生成,由Downloader执行
.url Request对应的请求URL地址
.method 对应的请求方法,‘GET’‘POST’等
.headers 字典类型风格的请求头
.body 请求内容主体,字符串类型
.meta 用户添加的扩展信息,在Scrapy内部模板间传递信息使用
.copy() 复制该请求
Respons类
Response对象表示一个HTTP相应
由Downloader生成,由Spider处理
.url Response对应的URL地址
.status HTTP状态码,默认为200
.headers Respose对应的头部信息
.body Response对应的内部信息,字符串类型
.flags 一组标记
.request 产生Response类型对应的Request对象
.copy() 复制该响应
Item类
Item对象表示一个从HTML页面中提取的信息内容
由Spider生成,由Item Pipelines处理
Item类似字典类型,可以按照字典类型操作
Scrapy爬虫支持多种HTML信息提取方法
Beautiful Soup
lxml
re
XPath Selector
CSS Selector
CSS Selector的基本使用
< HTML>.css(‘a::attr(href)’).extract() #a为标签名,href为标签属性
编写spider
class StockSpider(scrapy.Spider):
name = 'stock'
allowed_domains = ['baidu.com']
start_urls = ['http://quote.eastmoney.com/stocklist.html']
def parse(self, response):
for href in response.css('a::attr(href)').extract:
try:
stock=re.findall(r"[s][hz]\d{6}",href)[0]
url='https://guopiao.baidu.com/stock/'+stock+'.html'
yield scrapy.Request(url,callback=self.parse_stock)
except:
continue
def parse_stock(self,response):
infoDict={
}
stockInfo=response.css('.stock-bets')
name=stockInfo.css('.bets-name').extract()[0]
keyList=stockInfo.css('dt').extract()
valueList=stockInfo.css('dd').extract
for i in range(len(keyList)):
key=re.findall(r'>.*,keyList[i])[0][1:5]
try:
val=re.findall(r'\d+\.?.*',valueList[i])[0][0:5]
except:
val='--'
infoDict[key]=val
infoDict.update({
"股票名称":re.findall('\s.*\(',name)[0].split()[0]+
re.findall('\>.*<',name)[0][1:-1]})
yield infoDict
编写piplines.py
class CestPipeline(object): #cest为工程名
def process_item(self, item, spider):
return item
class BaidustocksInfoPipeline(object):
def open_spoder(self,spider):
self.f=open('BaiduStockInfo.txt','w')
def close_spoder(self,spider):
self.f.close()
def process_item(self,item,spider):
try:
line=str(dict(item))+'\n'
self.f.write(line)
except:
pass
return item
优化settings.py
找到#ITEM_PIPELINES = { 'CEST.pipelines.CestIPpeline': 300, }
修改为ITEM_PIPELINES = { 'CEST.pipelines.CestIPInfopeline': 300, }
命令提示符中运行 scrapy crwal stock
配置并发连接选项
CONCURRENT_REQUESTS Downloader最大并发请求下载数量,moren32
CONCURRENT_ITEMS Item Pipeline最大并发ITEM处理数量,默认100
CONCURRENT_REQUESTS_PER_DOMAIN 每个目标名最大的并发请求数量,默认8
CONCURRENT_REQUESTS_PER_IP 每个目标IP最大的并发请求数量,默认0,非0有效
ps:实例仅供参考,因为网页原因不能爬取
ps:学习链接 https://www.icourse163.org/learn/BIT-1001870001?tid=1206951268#/learn/announce