Python爬虫系列:Scrapy爬取实例(End~)

2021-07-29 11:20:07 浏览数 (1)

大家好,我是小 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爬虫系列,未完待续...

0 人点赞