2021年07月16日 00:00 __ _ _ _ _

文章配图

内观自己,摆脱焦虑。

文章配图

大家好,我是小 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爬取请求的处理

我们在BaiduStocks\BaiduStocks\spiders文件目录下找到stocks.py文件,打开并修改。修改代码如下;


import reimport scrapyclass 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选项


from itemadapter import ItemAdapterclass 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。如下:


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爬虫系列,未完待续…

文章配图

文章配图

为你,千千万万遍.

往期推荐:

Python爬虫系列:何为Scrapy框架? 2021-07-13
文章配图

Windows11如何将任务栏图标变小 2021-07-09
文章配图

一键三连,就差你了
文章配图

预览时标签不可点

阅读




__