大家好,我是小 Bob,一个关注软件领域而又执着于计算机底层的开发者~
emmm,最近开始准备Java的文章,关于Python爬虫的文章也决定告一段落,那么这里小编决定给大家再来分析一下关于Scrapy.
目录:
1.编写一个工程和spider模板
2.编写spider
3.编写Item Pipeline
4.优化配置策略
1.编写一个工程和spider模板
列出相关命令:
scrapy startproject BaiduStocks
cd BaiduStocks
scrapy genspider stocks baidu.com
->进一步修改spiders/stocks.py文件
2..编写Spider
对Spider编写包括以下处理:
- 配置stocks.py文件
- 修改对返回页面的处理
- 修改对新增URL爬取请求的处理
我们在BaiduStocksBaiduStocksspiders文件目录下找到stocks.py文件,打开并修改。修改代码如下;
代码语言:javascript复制import re
import scrapy
class StocksSpider(scrapy.Spider):
name = 'stocks'
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://gupiao.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'>.*</dt>',keyList[i])[0][1:-5]
try:
val=re.findall(r'd .?.*</dd>',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
3.编写Item Pipeline
编写Pipelines需要进行以下处理:
1.配置Pipelines.py文件
2.定义对爬取项(Scrapy Item)的处理类
3.配置ITEM_PIPELINES选项
代码语言:javascript复制from itemadapter import ItemAdapter
class BaidustocksPipeline(project):
def process_item(self, item, spider):
return item
class BaiduStocksInfoPipeline(project):
def open_spider(self,spider):
self.f=open('BaiduStockInfo.txt','w')
def close_spider(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
在运行爬虫之前还需对setting.py文件进行修改:
在上述文件中找到相关选项,并去掉注释,加上Info。如下:
代码语言:javascript复制ITEM_PIPELINES = {
'BaiduStocks.pipelines.BaiduStocksInfoPipeline': 300,
}
最后运行需执行如下命令:
scrapy crawl stocks
4.优化配置策略
settings.py文件配置:(选项以及说明)
CONCURRENT_REQUESTS Downloader:最大并发请求下载数量,默认32
CONCURRENT_ITEMS Item Pipeline:最大并发ITEM处理数量,默认100
CONCURRENT_REQUESTS_PER_DOMAIN:每个目标域名最大的并发请求,默认8
CONCURRENT_REQUESTS_PER_IP:每个目标IP最大的并发请求数量,默认0,非0有效
Python爬虫系列,未完待续...